Сайт без HTTPS браузеры помечают как небезопасный, а сертификат Let's Encrypt бесплатен и выпускается за минуту. Разберём весь путь: от установки nginx до автопродления.
Предполагается, что базовая настройка сервера уже сделана — если нет, начните с первой настройки VPS.
Что нужно заранее
Домен, A-запись которого указывает на IP вашего сервера. Проверить можно командой dig +short ваш-домен.ru — она должна вернуть IP сервера. Изменения DNS иногда расходятся до нескольких часов.
Установить nginx
root@vps:~#apt update && apt install nginx -yПроверьте, что служба запущена:
root@vps:~#systemctl status nginx --no-pagerОткройте http://ваш-IP в браузере — должна появиться страница «Welcome to nginx». Если страницы нет, почти всегда виноват файрвол: убедитесь, что открыт порт 80 (ufw allow 80/tcp).
Создать конфиг сайта
Не редактируйте default — заведите отдельный файл под каждый домен:
root@vps:~#nano /etc/nginx/sites-available/example.ruМинимальный рабочий конфиг:
server {
listen 80;
listen [::]:80;
server_name example.ru www.example.ru;
root /var/www/example.ru;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Создайте каталог сайта и тестовую страницу:
root@vps:~#mkdir -p /var/www/example.ruroot@vps:~#echo "<h1>Работает</h1>" > /var/www/example.ru/index.htmlroot@vps:~#chown -R www-data:www-data /var/www/example.ruВключить сайт и проверить конфиг
Включение сайта в nginx — это симлинк из sites-available в sites-enabled:
root@vps:~#ln -s /etc/nginx/sites-available/example.ru /etc/nginx/sites-enabled/root@vps:~#nginx -tКоманда nginx -t обязательна: она проверяет синтаксис до перезагрузки. Если вывод заканчивается на syntax is ok и test is successful, применяем:
root@vps:~#systemctl reload nginxПочему стоит использовать reload, а не restart?
Выпустить сертификат
Ставим certbot с плагином для nginx:
root@vps:~#apt install certbot python3-certbot-nginx -yЗапускаем выпуск — плагин сам найдёт server_name и допишет конфиг:
root@vps:~#certbot --nginx -d example.ru -d www.example.ruCertbot спросит почту для уведомлений об истечении сертификата и предложит включить редирект с HTTP на HTTPS — соглашайтесь.
Ошибка проверки домена
Если certbot пишет о неудачной проверке, значит он не смог достучаться до http://example.ru/.well-known/.... Проверьте, что A-запись домена указывает на этот сервер, порт 80 открыт и nginx отвечает по доменному имени, а не только по IP.
Проверить автопродление
Сертификаты Let's Encrypt живут 90 дней. Certbot ставит systemd-таймер, который продлевает их автоматически. Убедитесь, что таймер активен:
root@vps:~#systemctl list-timers | grep certbotИ прогоните продление вхолостую:
root@vps:~#certbot renew --dry-runЕсли тест прошёл без ошибок — про сертификат можно забыть.
Добавить базовую защиту заголовками
Несколько строк в блок server заметно повышают безопасность:
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
Применяем:
root@vps:~#nginx -t && systemctl reload nginxЧастые проблемы
502 Bad Gateway — nginx работает, но приложение за ним не отвечает. Проверьте, слушает ли ваш backend нужный порт: ss -tlnp.
Сертификат выпущен, но браузер ругается — вероятно, открыт не тот виртуальный хост. Посмотрите, какой блок отвечает на домен: nginx -T | grep server_name.
Слишком много запросов к Let's Encrypt — у центра сертификации есть лимит на выпуск для одного домена в неделю. Отлаживайте конфиг с флагом --dry-run.