nginx — виртуальные хосты, SSL
nginx — один из самых популярных веб-серверов. Он умеет отдавать статику, проксировать запросы на бэкенд и держать тысячи соединений одновременно почти без нагрузки на сервер. В этой статье разберём три базовые задачи: виртуальные хосты, HTTPS и проксирование.
Установка
Ubuntu / Debian:
apt update apt install -y nginx systemctl enable nginx systemctl start nginx
Проверяем что работает:
systemctl status nginx # или просто открываем http://IP-сервера — увидим страницу Welcome to nginx
Конфиги лежат здесь:
/etc/nginx/nginx.conf — главный конфиг /etc/nginx/conf.d/ — конфиги сайтов (подключаются автоматически) /var/log/nginx/access.log — логи запросов /var/log/nginx/error.log — логи ошибок
Виртуальные хосты
Виртуальный хост — это отдельный сайт на одном сервере. На одном IP можно держать 10 сайтов, nginx будет раздавать нужный по доменному имени.
Создаём конфиг для сайта:
nano /etc/nginx/conf.d/mysite.conf
server {
listen 80;
server_name mysite.ru www.mysite.ru;
root /var/www/mysite;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Что здесь написано:
listen 80— слушаем HTTP на порту 80server_name— для каких доменов работает этот блокroot— папка с файлами сайтаtry_files— пробуем найти файл, если нет — возвращаем 404
Создаём папку и тестовую страницу:
mkdir -p /var/www/mysite echo "<h1>Привет!</h1>" > /var/www/mysite/index.html
Проверяем конфиг и перезагружаем:
nginx -t # проверка синтаксиса nginx -s reload # перезагрузка без остановки
HTTPS через Let's Encrypt
Let's Encrypt — бесплатный SSL-сертификат. Certbot автоматически получает его и настраивает nginx.
apt install -y certbot python3-certbot-nginx certbot --nginx -d mysite.ru -d www.mysite.ru
Certbot задаст пару вопросов (email, согласие с правилами) и сам допишет конфиг nginx — добавит SSL, порт 443, редирект с HTTP на HTTPS.
Сертификат действует 90 дней. Автопродление настраивается само при установке:
# Проверить что автопродление работает certbot renew --dry-run
Проксирование на бэкенд
Чаще всего nginx используют как прокси перед приложением — Django, Node.js, Go. Приложение слушает на локальном порту (например 8000), а nginx принимает запросы снаружи и передаёт их.
server {
listen 443 ssl;
server_name mysite.ru;
ssl_certificate /etc/letsencrypt/live/mysite.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mysite.ru/privkey.pem;
# Статику отдаём сами — быстрее чем через бэкенд
location /static/ {
root /var/www/mysite;
}
# Всё остальное — на приложение
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;
}
}
# Редирект HTTP → HTTPS
server {
listen 80;
server_name mysite.ru;
return 301 https://$host$request_uri;
}
Заголовки proxy_set_header нужны чтобы приложение знало реальный IP клиента и что запрос пришёл по HTTPS — без них Django или другой фреймворк будет видеть IP сервера вместо IP посетителя.
Полезные команды
nginx -t # проверить конфиг на ошибки nginx -s reload # перезагрузить конфиг systemctl restart nginx # полный перезапуск tail -f /var/log/nginx/error.log # следить за ошибками в реальном времени