NGINX
NGINX (engine x — по-русски произносится как энджи́нкс или э́нжин-и́кс) — веб-сервер и почтовый прокси-сервер, работающий на Unix-подобных операционных системах (тестировалась сборка и работа на FreeBSD, OpenBSD, Linux, Solaris, macOS, AIX и HP-UX).
Содержание
Функциональность
Распределение нагрузки
NGINX Open Source
NGINX Plus Load balancer
HTTP and TCP/UDP support
Yes
Yes
Layer 7 request routing
Yes
Yes
Session persistence
Yes
Yes
Active health checks
No
Yes
DNS service‑discovery integration
No
Yes
Оперативный запас содержимого
Content cache
Static and dynamic content caching
Yes
Yes
Cache‑purging API
No
Yes
Веб-сервер и обратный прокси
Web server and reverse proxy
Origin server for static content
Yes
Yes
Reverse proxy: HTTP, FastCGI, memcached, SCGI, uwsgi
Yes
Yes
HTTP/2 gateway
Yes
Yes
gRPC proxy
Yes
Yes
HTTP/2 server push
Yes
Yes
Управление безопасностью
Security controls
HTTP Basic Authentication
Yes
Yes
HTTP authentication subrequests
Yes
Yes
IP address‑based access control lists
Yes
Yes
Rate limiting
Yes
Yes
Dual‑stack RSA/ECC SSL/TLS offload
Yes
Yes
TLS 1.3 support
Yes
Yes
JWT authentication
No
Yes
OpenID Connect single sign‑on (SSO)
No
Yes
NGINX App Protect (additional cost)
No
Yes
Мониторинг
Monitoring Export to external monitoring tools
Yes
Yes
Built-in dashboard
No
Yes
Extended status with 100+ additional metrics
No
Yes
Высокая доступность
High availability (HA)
Active‑active and active‑passive modes
No
Yes
Configuration synchronization across cluster
No
Yes
State sharing: sticky‑learn session persistence, rate limiting, key‑value stores
No
Yes
Расположенность к программированию
Programmability
NGINX JavaScript module
Yes
Yes
NGINX Plus API for dynamic reconfiguration
No
Yes
Key‑value store
No
Yes
Dynamic reconfiguration without process reloads
No
Yes
Трансляция видео и аудио
Streaming media
Live streaming: RTMP, HLS, DASH
Yes
Yes
VOD: Flash (FLV), MP4
Yes
Yes
Adaptive bitrate VOD: HLS, HDS
No
Yes
MP4 bandwidth controls
No
Yes
Экосистемы третьих сторон
Third-party ecosystem
Ingress controller
Yes
Yes
OpenShift Router
Yes
Yes
Dynamic modules repository
No
Yes Commercial support No
Yes
https://www.nginx.com/products/nginx/compare-models
Особенности
В nginx рабочие процессы обслуживают одновременно множество соединений, мультиплексируя их вызовами операционной системы select, epoll (Linux) и kqueue (FreeBSD). Рабочие процессы выполняют цикл обработки событий от дескрипторов (см. Событийно-ориентированное программирование). Полученные от клиента данные разбираются с помощью конечного автомата. Разобранный запрос последовательно обрабатывается цепочкой модулей, задаваемой конфигурацией. Ответ клиенту формируется в буферах, которые хранят данные либо в памяти, либо указывают на отрезок файла. Буфера объединяются в цепочки, определяющие последовательность, в которой данные будут переданы клиенту. Если операционная система поддерживает эффективные операции ввода-вывода, такие, как writev и sendfile, то nginx применяет их по возможности.
Алгоритм работы HTTP-сервера выглядит следующим образом:
получить очередной дескриптор из kevent(2); прочитать данные из файла и записать в socket, используя либо write(2)/read(2), например, так while (
( cnt = read ( read_file_descriptor, buffer, block_size ), write ( socket_file_descriptor, buffer, count ) == cnt )
)
byte_count += count;
либо используя системный вызов sendfile(2), выполняющий те же действия, что приведённый выше код, но в пространстве ядра; перейти к шагу 1. Конфигурация HTTP-сервера nginx разделяется на виртуальные серверы (директива «server»). Виртуальные серверы разделяются на location’ы («location»). Для виртуального сервера возможно задать адреса и порты, на которых будут приниматься соединения, а также имена, которые могут включать «*» для обозначения произвольной последовательности в первой и последней части, либо задаваться регулярным выражением.
location’ы могут задаваться точным URI, частью URI либо регулярным выражением. location’ы могут быть сконфигурированы для обслуживания запросов из статического файла, проксирования на fastcgi/memcached сервер.
Для эффективного управления памятью nginx использует пулы. Пул — это последовательность предварительно выделенных блоков динамической памяти. Длина блока варьируется от 1 до 16 килобайт. Изначально под пул выделяется только один блок. Блок разделяется на занятую область и незанятую. Выделение мелких объектов выполняется путём продвижения указателя на незанятую область с учётом выравнивания. Если незанятой области во всех блоках не хватает для выделения нового объекта, то выделяется новый блок. Если размер выделяемого объекта превышает значение константы NGX_MAX_ALLOC_FROM_POOL либо длину блока, то он полностью выделяется из кучи.
Таким образом, мелкие объекты выделяются очень быстро и имеют накладные расходы только на выравнивание.
nginx содержит модуль географической классификации клиентов по IP-адресу. В его основу входит база данных соответствия IP-адресов географическому региону, представленная в виде radix tree (сжатое префиксное дерево или сжатый лес) в оперативной памяти. nginx предварительно распределяет первые несколько уровней дерева таким образом, чтобы они занимали ровно 1 страницу памяти. Это гарантирует, что при поиске IP-адреса для первых нескольких узлов при трансляции адреса всегда найдётся запись в TLB.