Nginx: базовая настройка

Nginx — высокопроизводительный web-сервер и reverse proxy: используется для раздачи статических файлов, настройки HTTPS, проксирования запросов к приложению и виртуальных хостов.

Зачем нужно

Nginx — стандарт для production-серверов. В отличие от Node.js, он эффективно раздаёт статику (тысячи файлов без нагрузки на CPU), умеет SSL-терминацию, обрабатывает сотни тысяч одновременных соединений и не зависает при медленных клиентах (slowloris-атаки).

Где используется

  • Раздача статического сайта или SPA (React, Vue)
  • Настройка HTTPS с Let's Encrypt через certbot
  • Виртуальные хосты — несколько сайтов на одном IP
  • Reverse proxy перед Node.js / Python / PHP приложением

Основной контент

Установка (Ubuntu/Debian)

sudo apt update
sudo apt install nginx

# Проверить статус
sudo systemctl status nginx
sudo systemctl enable nginx    # автостарт при перезагрузке

# Директории конфигов
/etc/nginx/nginx.conf                  # главный конфиг
/etc/nginx/sites-available/            # конфиги виртуальных хостов
/etc/nginx/sites-enabled/             # симлинки на активные конфиги
/var/log/nginx/access.log              # логи доступа
/var/log/nginx/error.log               # логи ошибок

Конфиг для статического сайта

# /etc/nginx/sites-available/mysite
server {
    listen 80;
    server_name example.com www.example.com;

    root /var/www/mysite;
    index index.html;

    # SPA: неизвестные маршруты → index.html
    location / {
        try_files $uri $uri/ /index.html;
    }

    # Кэширование статики
    location ~* \.(js|css|png|jpg|ico|woff2)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }

    # Gzip-сжатие
    gzip on;
    gzip_types text/plain text/css application/json application/javascript;
    gzip_min_length 1000;
}

Активация конфига и HTTPS

# Активировать сайт (симлинк)
sudo ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/

# Проверить синтаксис
sudo nginx -t

# Применить
sudo nginx -s reload

# Установить certbot (Let's Encrypt)
sudo apt install certbot python3-certbot-nginx

# Получить сертификат и автонастроить Nginx
sudo certbot --nginx -d example.com -d www.example.com

Конфиг с HTTPS (после certbot)

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;

    root /var/www/mysite;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html;
    }
}

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

Полезные команды

nginx -t                         # проверить конфиг
nginx -s reload                  # reload без рестарта
systemctl restart nginx          # полный рестарт
tail -f /var/log/nginx/error.log # смотреть ошибки

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

  • Изменить конфиг без nginx -t — синтаксическая ошибка при reload не применяет изменения, иногда роняет Nginx
  • Раздавать статику из директории с правами 700 — Nginx (пользователь www-data) не может читать файлы
  • Не настроить gzip — статические ресурсы передаются без сжатия
  • Не настроить ssl_protocols — по умолчанию может включать устаревший TLS 1.0/1.1

Связанные темы

Ресурсы