Можно ли настроить NGINX для работы одновременно по протоколам HTTP и HTTPS без перезапуска?

Как можно настроить конфигурацию сервера nginx так, чтобы избежать необходимости остановки сервера и комментирования/раскомментирования участков кода при получении SSL-сертификатов?
  • 6 февраля 2024 г. 20:58
Ответы на вопрос 2
Да, можно настроить NGINX для работы одновременно по протоколам HTTP и HTTPS без необходимости его перезапуска. Чтобы избежать остановки сервера при изменениях в конфигурации, вместо перезапуска NGINX можно использовать его плавное перезагрузку с помощью команды `nginx -s reload`.

Чтобы настроить NGINX для работы с HTTP и HTTPS, вам нужно будет настроить два серверных блока (server block) — один для HTTP на порту 80 и один для HTTPS на порту 443. В случае, если у вас ещё нет SSL-сертификатов и вы хотите избежать ошибок при запуске NGINX, вы можете установить самоподписанный сертификат для временной работы по HTTPS до того как получите настоящий сертификат.

Пример базовой конфигурации для NGINX:

```nginx
# HTTP server block
server {
    listen 80;
    server_name example.com www.example.com;

    location / {
        root /var/www/html;
        index index.html index.htm;
    }

    # Перенаправление с HTTP на HTTPS
    # Уберите следующие две строки, если не хотите автоматическое перенаправление
    # return 301 https://$server_name$request_uri;
}

# HTTPS server block
server {
    listen 443 ssl;
    server_name example.com www.example.com;

    # Пути к сертификату и приватному ключу
    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    # Настройки SSL
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers '...';

    # Другие директивы SSL...

    location / {
        root /var/www/html;
        index index.html index.htm;
    }
}
```

Если вы только начинаете и у вас ещё нет сертификатов, вы можете сгенерировать самоподписанный сертификат и использовать его временно:

```bash
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/example.com.key -out /etc/nginx/ssl/example.com.crt
```

Заполните требуемые данные, и этот самоподписанный сертификат и ключ можно использовать в конфигурации HTTPS.

После изменения конфигурации не забудьте проверить её на ошибки:

```bash
sudo nginx -t
```

Если все верно, выполните плавную перезагрузку NGINX:

```bash
sudo nginx -s reload
```

Когда у вас появится настоящий SSL-сертификат (например, от Let's Encrypt), вы просто обновите пути к сертификату и приватному ключу в конфигурации NGINX и снова выполните `nginx -s reload`.
Если так невмоготу комментировать весь блок 443, можно сделать так: 
Reload nginx-у, получение сертификата(ов), возвращение настроек к нормальному состоянию, опять reload, всё.
Похожие вопросы