Шаг 6 · Web · 35 минут

Домен, Nginx и HTTPS: проводим запрос до приложения

Сейчас приложение доступно внутри VPS по адресу вроде 127.0.0.1:8000. Сделаем красивый домен, безопасное соединение и одну контролируемую точку входа.

Карта запроса

Браузер спрашивает DNS, какой IP принадлежит домену. Затем подключается к Nginx на порту 443. Nginx расшифровывает HTTPS и передаёт запрос приложению на локальный порт. Такой посредник называется reverse proxy.

1. Направляем домен на VPS

В DNS‑редакторе регистратора создайте записи:

Тип Имя Значение
A @ IP_СЕРВЕРА
A www IP_СЕРВЕРА

@ означает основной домен. TTL можно оставить стандартным. Изменения распространяются не мгновенно — иногда несколько часов.

dig +short example.ru
dig +short www.example.ru

Обе команды должны вернуть IP вашего VPS. Если dig не установлен, используйте nslookup example.ru.

2. Проверяем приложение

curl http://127.0.0.1:8000/health
sudo ss -tulpn | grep 8000

Приложение должно отвечать локально. Идеально, если оно слушает 127.0.0.1, а не 0.0.0.0: тогда порт нельзя обойти снаружи.

3. Устанавливаем Nginx

sudo apt update
sudo apt install -y nginx
sudo systemctl enable --now nginx
sudo ufw allow 'Nginx Full'

Nginx Full открывает 80 для HTTP и 443 для HTTPS. Проверьте sudo ufw status и откройте в браузере http://IP_СЕРВЕРА.

4. Создаём конфигурацию

sudo nano /etc/nginx/sites-available/app
server {
  listen 80;
  listen [::]:80;
  server_name example.ru www.example.ru;

  location / {
    proxy_pass http://127.0.0.1:8000;
    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;
  }
}

Замените домен. Активируйте сайт и проверяйте конфигурацию перед каждым reload:

sudo ln -s /etc/nginx/sites-available/app /etc/nginx/sites-enabled/app
sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx
curl -I http://example.ru

Ожидаем HTTP 200 или осмысленный ответ приложения. Ошибка 502 означает, что Nginx не может связаться с портом 8000: проверьте контейнер и адрес.

5. Выпускаем сертификат

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d example.ru -d www.example.ru

Certbot проверит домен, получит сертификат и дополнит Nginx. На вопрос о перенаправлении выбирайте HTTPS redirect.

curl -I https://example.ru
sudo certbot certificates
sudo certbot renew --dry-run

Последняя команда имитирует продление. Сертификаты короткоживущие, поэтому автоматическое продление критично.

6. Разумные ограничения

Добавьте внутрь блока server, затем снова выполните nginx -t:

client_max_body_size 2m;
client_body_timeout 10s;
proxy_connect_timeout 10s;
proxy_read_timeout 60s;
server_tokens off;

Частые ошибки

  • Certbot не подтверждает домен — DNS ещё ведёт не на этот VPS или закрыт порт 80.
  • 502 Bad Gateway — приложение не запущено либо указан неверный порт.
  • 403 Forbidden — проверьте права и выбранный location.
  • Старый сайт всё ещё открывается — проверьте активные файлы в sites-enabled.
Никогда не применяйте Nginx через restart без sudo nginx -t. Проверка не изменяет работающий сервер и ловит опечатку заранее.

Что дальше

Публичный сервис уже требует страховки данных: настроим резервные копии →