nginx

Материал из llmdocs — справочник разработчика
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]

См. также

Источники

  1. nginx — документация
  2. nginx — Beginner's Guide
  3. nginx — ngx_http_upstream_module
  4. nginx — How nginx processes a request
  5. Dan Kegel — The C10K problem
  6. freenginx