Linux & Administration

Nginx

Веб-сервер и обратный прокси с событийной архитектурой, который держит десятки тысяч одновременных соединений на скромном железе.

Что такое Nginx

Nginx (читается «энджин-икс», от engine x) — веб-сервер, обратный прокси и балансировщик нагрузки. Написан Игорем Сысоевым как ответ на проблему C10K — десять тысяч одновременных соединений на одном сервере, с которой не справлялась схема «поток на клиента».

Решение — событийная модель. Nginx запускает несколько worker-процессов (обычно по числу ядер CPU), и каждый в неблокирующем цикле обслуживает тысячи соединений. Простаивающее соединение не занимает ни потока, ни мегабайтов стека — только запись в таблице событий.

Четыре роли Nginx

  • Раздача статики — файлы отдаются напрямую из файловой системы, быстрее любого приложения
  • Обратный прокси — принимает запрос и передаёт его backend-приложению (Gunicorn, Node.js, php-fpm)
  • Балансировщик — раскидывает запросы по нескольким бэкендам
  • TLS-терминатор — снимает шифрование, backend работает по обычному HTTP

Что такое upstream в Nginx

upstream — именованная группа backend-серверов, к которой потом обращаются через proxy_pass. Это способ сказать «за этим именем стоит вот такой набор машин, вот правило выбора между ними».

upstream app_backend {
    least_conn;                       # к наименее загруженному
    server 10.0.0.11:8000 weight=2;   # мощнее — больше запросов
    server 10.0.0.12:8000;
    server 10.0.0.13:8000 backup;     # включится, если первые два лягут
    keepalive 32;                     # пул постоянных соединений
}

server {
    listen 443 ssl;
    server_name example.ru;

    ssl_certificate     /etc/letsencrypt/live/example.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.ru/privkey.pem;

    location /static/ {
        root /var/www/example;
        expires 30d;
    }

    location / {
        proxy_pass http://app_backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Без upstream можно писать proxy_pass http://10.0.0.11:8000; напрямую — но тогда сервер один и балансировки нет.

Ошибка «502 Bad Gateway»

Самая частая жалоба на Nginx. Она почти никогда не про Nginx: 502 означает, что backend не ответил. Проверять надо приложение — упало ли оно, слушает ли нужный порт или сокет, не убил ли его OOM killer.

Рабочие команды

sudo nginx -t                  # проверить синтаксис ДО перезапуска
sudo systemctl reload nginx    # применить конфиг без разрыва соединений
sudo tail -f /var/log/nginx/error.log

reload вместо restart — Nginx поднимает новые worker-процессы, а старые дорабатывают текущие запросы. Клиенты ничего не замечают.

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

Готовы запустить GPU-задачу?

Запустить GPU-сервер