Настраиваем 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.