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-процессы, а старые дорабатывают текущие запросы. Клиенты ничего не замечают.
Связанные термины
- Apache — второй классический веб-сервер, другая модель обработки
- LEMP-стек — связка, где Nginx даёт букву E
- load balancer — роль, которую закрывает блок upstream
- Локальный / веб-сервер — общее понятие веб-сервера
- Gunicorn / WSGI — типичный backend за Nginx
- SSL-сертификат — то, что Nginx отдаёт клиенту при HTTPS
Готовы запустить GPU-задачу?
Запустить GPU-сервер