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 на порту 80
  • server_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   # следить за ошибками в реальном времени

Комментарии

Комментариев пока нет.