nginx
| Тип | веб-сервер, обратный прокси, балансировщик, почтовый и TCP/UDP-прокси |
|---|---|
| Автор | Игорь Сысоев |
| Первый публичный выпуск | октябрь 2004 |
| Язык | C |
| Лицензия | BSD-2-Clause |
| Архитектура | событийная, асинхронная, несколько рабочих процессов |
| Владелец торговой марки | F5 (с 2019, ранее Nginx, Inc.) |
| Форки | freenginx (2024), Angie (2022) |
nginx (произносится «энджин-икс», от engine x) — веб-сервер и обратный прокси с открытым исходным кодом. Его отличает событийная архитектура: небольшое число рабочих процессов обслуживает десятки тысяч одновременных соединений, расходуя мало памяти. nginx отдаёт статические файлы, завершает TLS, проксирует запросы к приложениям, балансирует нагрузку, кэширует ответы и проксирует TCP и UDP.
nginx — один из самых распространённых веб-серверов в мире; он работает на огромной доле самых посещаемых сайтов, а его производные используются как Ingress-контроллеры Kubernetes и основа многих CDN.
История
Игорь Сысоев, системный администратор компании «Рамблер», начал писать nginx в 2002 году, чтобы решить проблему C10K — обслуживание десяти тысяч одновременных соединений на одном сервере, с которой плохо справлялся Apache с моделью «процесс или поток на соединение».[5] Первый публичный выпуск состоялся в октябре 2004 года под лицензией BSD.
В 2011 году Сысоев с соратниками основал компанию Nginx, Inc., выпустившую коммерческую версию NGINX Plus; в 2019 году её купила американская F5 Networks. В 2022 году Сысоев покинул проект. Часть бывших разработчиков создала совместимый форк Angie, а в 2024 году один из ключевых разработчиков, Максим Дунин, запустил некоммерческий форк freenginx.[6]
Архитектура
Главный процесс читает конфигурацию и управляет рабочими процессами — обычно по одному на ядро процессора. Каждый рабочий процесс в цикле событий (epoll в Linux, kqueue в BSD) неблокирующе обрабатывает тысячи соединений: пока один клиент медленно получает данные, процесс обслуживает остальных. Это та же идея, что у asyncio и Node.js (см. Конкурентность и параллелизм). Конфигурацию можно перечитать без разрыва соединений: nginx -s reload запускает новые рабочие процессы, а старые дорабатывают текущие запросы.
Конфигурация
Конфигурация — иерархия блоков: http содержит блоки server (виртуальные хосты), а те — блоки location для путей.[2]
# /etc/nginx/conf.d/example.conf
server {
listen 80;
server_name example.com www.example.com;
return 301 https://example.com$request_uri; # всё на HTTPS
}
server {
listen 443 ssl;
http2 on;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
root /var/www/example;
index index.html;
gzip on;
gzip_types text/css application/javascript application/json;
location / {
try_files $uri $uri/ =404; # статический сайт
}
location /api/ {
proxy_pass http://127.0.0.1:8000; # приложение
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Выбор блока server идёт по порту, затем по имени из заголовка Host или SNI, а location — по правилам: точное совпадение =, затем самый длинный префикс, затем регулярные выражения по порядку.[4]
sudo nginx -t # проверить синтаксис конфигурации
sudo systemctl reload nginx # применить без простоя
sudo tail -f /var/log/nginx/error.log
Основные возможности
- Статика — отдача файлов с помощью
sendfile, кэширующие заголовки, сжатие. - Проксирование — HTTP, WebSocket, gRPC, FastCGI (PHP), uwsgi.
- Балансировка — группы
upstreamс алгоритмами round robin,least_conn,ip_hash,hashи пассивной проверкой здоровья.[3] - Кэш ответов бэкенда на диске (
proxy_cache). - Ограничения — частоты запросов (
limit_req), числа соединений, размера тела запроса. - TCP/UDP-прокси (модуль
stream) — для баз данных, DNS и маршрутизации TLS по SNI без расшифровки. - HTTP/2 и HTTP/3 — HTTP/3 поверх QUIC поддерживается с версии 1.25 (2023).
Сертификаты Let's Encrypt обычно выпускает и продлевает Certbot, умеющий сам править конфигурацию nginx.
Типичные ошибки
proxy_pass http://app/с косой чертой в конце и без неё ведут себя по-разному: с косой чертой префиксlocationвырезается из пути.- Директива
ifвнутриlocationработает неочевидно («if is evil»); для перенаправлений лучшеreturnиtry_files. - Забытый
client_max_body_size— загрузка файлов больше 1 МБ падает с кодом 413. - Без
proxy_set_header Hostбэкенд получает имя upstream вместо домена сайта. - Ошибки 502 и 504 обычно означают проблемы бэкенда, а не nginx: смотрите
error.logи логи приложения (journald и логи).
nginx и альтернативы
Caddy проще в настройке и сам получает сертификаты; HAProxy специализируется на балансировке; Traefik и Envoy рассчитаны на динамические окружения с контейнерами. Apache HTTP Server остаётся популярным благодаря .htaccess и модулям. nginx же сочетает зрелость, производительность и огромное количество готовых примеров конфигурации; полная справка по директивам — в официальной документации.[1]