Настраиваем Nginx для сайта

Настроим редиректы с портов 80, 443 на наше приложение + SSL-сертификаты

Сервера, как правило, хостят множество сайтов, но запрос по url всегда приходит на порт 80. Сделаем стандартную настройку Nginx для обработки HTTP-трафика с порта 80 и HTTPS с порта 443 с использованием бесплатных сертификатов Let's Encrypt. Эта конфигурация включает перенаправление с HTTP на HTTPS, интеграцию Certbot для выпуска сертификатов и автоматизацию их обновления, что критично для современных веб-приложений.​​

Базовая настройка портов в Nginx

После установки новой системы и nginx, в папке /etc/nginx/sites-available/ есть стандартная конфигурация в файле default. Создадим рядом другой конфиг с лубым именем (например you-site.ru.conf). В этом файле конфигурации создадим два блока server: один для порта 80, другой для 443. Для порта 80 настроим простое перенаправление на HTTPS, чтобы все незащищённые запросы автоматически переходили на безопасный вариант.​

Пример конфигурации для порта 80 (HTTP)

server {     
    listen 80;
    listen [::]:80;     
    server_name example.com www.example.com; 
}

Эта директива return 301 генерирует постоянный редирект, сохраняя путь запроса и серверное имя. Укажите ваш домен в server_name для точной обработки.

Вторая секция для server создастся автоматически после выпуска сертификатов certbot'ом​. Поговорим про нее чуть позже, чтобы сохранить последовательность конфигурации.

Выпуск SSL-сертификатов с Certbot

Certbot — инструмент от EFF, который автоматизирует получение сертификатов Let's Encrypt через ACME-протокол. Он верифицирует домен по HTTP (порт 80) и интегрируется с Nginx, автоматически добавляя ssl-директивы в конфигурацию.​

Установка и запуск Certbot

На Ubuntu/Debian выполним:

sudo apt update && sudo apt install certbot python3-certbot-nginx

Затем получим сертификат:

sudo certbot --nginx -d example.com -d www.example.com

Certbot запросит email для уведомлений, согласится с условиями и предложит редирект (выберите опцию 2 для автоматического перенаправления). Он создаст файлы в /etc/letsencrypt/live/example.com/ и обновит ваш .conf-файл. Если нужно, добавьте блок location для .well-known/acme-challenge в HTTP-блок для верификации:​

location /.well-known/acme-challenge {
    root /var/www/letsencrypt;
    allow all; 
}

Создайте директорию letsencrypt eсли ее нет: sudo mkdir -p /var/www/letsencrypt.​

После того как сертификаты выпущены, можно добавить редирект с 80 порта на 443 (с http на https)

server {     
    listen 80;
    listen [::]:80;     
    server_name example.com www.example.com;
  
    # redirect
    return 301 https://$server_name$request_uri;
}

Настройка порта 443 (HTTPS)

Для HTTPS добавим ssl-параметры в блок server. Их скорее всего создаст сам certbot (но если нет, добавим сами). Укажем пути к сертификату и ключу, а также рекомендуемые протоколы и шифры для безопасности.​

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name example.com www.example.com;

    # Пути к сертификатам (будут заполнены Certbot)
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # Рекомендуемые SSL-настройки
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;

    location / {
        # Пример: прокси на backend (например, порт 8080)
        proxy_pass http://127.0.0.1:8080/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Здесь http2 улучшает производительность, а proxy_pass полезен, если сайт работает на другом порту (например на 8080). После изменений проверьте синтаксис командой sudo nginx -t и перезагрузите: sudo systemctl reload nginx.​

Автоматическое обновление сертификатов

Сертификаты истекают через 90 дней, но Certbot настраивает автообновление по умолчанию через systemd-timer. Таймер проверяет сертификаты дважды в день и обновляет, если осталось менее 30 дней.​

Проверка и настройка обновления

Проверьте статус: sudo systemctl status certbot.timer. Для теста: sudo certbot renew --dry-run. Если таймер не активен, включите: sudo systemctl enable certbot.timer && sudo systemctl start certbot.timer. Certbot использует post-hook для reload Nginx: --post-hook "systemctl reload nginx", что минимизирует downtime. Альтернативно, добавьте в crontab (sudo crontab -e):​

0 */12 * * * /usr/bin/certbot renew --quiet --nginx

Это запустит проверку каждые 12 часов.​

Тестирование и советы

После настройки протестируйте сайт: https://example.com должен показывать зелёный замок без предупреждений. Используйте инструменты вроде SSL Labs для проверки (ssllabs.com/ssltest). Если проксируете на другой порт (как 8080), убедитесь, что backend поддерживает X-Forwarded-Proto для корректной работы HTTPS. Для нескольких доменов повторяйте процесс с --nginx -d domain2.com. Избегайте слабых шифров и регулярно обновляйте Nginx для патчей безопасности.​

Эта конфигурация сделает любой сайт полностью защищённым и готовым к продакшену.

Я освежал эти знания, пока готовил к продакшену свой блог с короткими статьями по разработке https://tldread.ru.