Nginx
Тема дорожной карты · DevOps Engineer
Nginx — событийный веб-сервер, обратный прокси и L7-балансировщик, который стал стандартом edge-инфраструктуры. Один процесс на ядро обслуживает десятки тысяч одновременных соединений за счёт epoll/kqueue, без накладных расходов на тред на запрос как у классического Apache. В DevOps Nginx выступает в трёх ролях: точка входа для HTTPS (TLS-терминатор), reverse proxy перед бэкендом и распределитель нагрузки между upstream-инстансами. В Kubernetes ingress-nginx остаётся самым популярным Ingress-контроллером по числу инсталляций.
Как это работает
Конфигурация Nginx собирается из директив в nginx.conf: http { server { location { ... } } }. Главный процесс читает конфиг, форкует worker-процессы и слушает сокеты. Каждый worker — single-threaded, асинхронный, использует epoll для мультиплексирования I/O. Запрос проходит по фазам: чтение, rewrite, access-checks, content (статика или proxy_pass), filters (gzip, headers), log. Reload через nginx -s reload поднимает новых worker'ов с новым конфигом и аккуратно завершает старых — без downtime. Для статики — sendfile напрямую из page cache в сокет, без копирования через user-space.
Когда применять
Nginx ставят как edge перед каждым production-приложением: терминируйте TLS на нём (Let's Encrypt через certbot или встроенно через ssl_certificate), кэшируйте статику (location /static/ { expires 30d; }), балансируйте трафик между несколькими бэкендами через upstream блоки (round-robin, least_conn, ip_hash). В Kubernetes это default-выбор для Ingress: один Ingress ресурс маппится в Nginx-конфиг через ingress-nginx controller. Для микросервисов без service mesh Nginx покрывает 80% задач: rate-limiting, gzip, basic auth, IP-allowlist, request body limits — всё нативно, без дополнительных сервисов.
Типичные ошибки
Грабли: дефолтный worker_connections 1024 упирается в потолок при росте трафика (поднимайте до 10000+); забытый proxy_buffering off нужен для server-sent events и потокового вывода; client_max_body_size по умолчанию 1 МБ — загрузки больше падают с 413; reload не подхватывает изменения в подключаемых файлах если они невалидны (всегда проверяйте nginx -t перед reload); один общий access.log на все virtual hosts мешает дебагу — пишите per-host логи; proxy_pass без trailing slash меняет поведение URL-rewriting — читайте документацию по location matching.