NGINX — различия между версиями

Материал из Брацка Правки
Перейти к: навигация, поиск
(Мониторинг)
 
(не показано 19 промежуточных версий этого же участника)
Строка 1: Строка 1:
[[NGINX]] (часто пишется строчными буквами, [[nginx]]; читается ''engine x'', по-русски произносится как ''энджи́нкс'' или ''э́нжин-и́кс''; здесь и далее -- ''NGINX'') -- одно из двух изделий, [[NGINX Open Source]] с открытым кодом или коммерческого [[NGINX Plus]], каждое из которых представляет собою инструмент обработки входящих запросов протоколов HTTP, HTTPS, TCP, UDP. NGINX изначально разрабатывался для работы на Unix-подобных операционных системах.
+
[[NGINX]] (часто пишется строчными буквами, [[nginx]]; читается ''engine x'', по-русски произносится как ''энджи́нкс'' или ''э́нжин-и́кс''; здесь и далее -- ''NGINX'') -- одно из двух изделий, [[NGINX Open Source]] с открытым кодом или коммерческое [[NGINX Plus]], каждое из которых представляет собою инструмент обработки входящих запросов протоколов IP, HTTP, HTTPS, TCP, UDP. ''NGINX'' изначально разрабатывался для работы на Unix-подобных операционных системах.
  
  
 
==Функциональность==
 
==Функциональность==
 +
Согласно https://www.nginx.com/products/nginx/compare-models.
  
 
===Распределение нагрузки===
 
===Распределение нагрузки===
{|class="wikitable"
+
{|class="wikitable" width=100%
|+ NGINX для распределения нагрузки (load balancer)
+
|+ NGINX как распределитель нагрузки ([[load balancer]])
 
!Функционал!!NGINX Open Source!!Nginx Plus
 
!Функционал!!NGINX Open Source!!Nginx Plus
 
|-
 
|-
Строка 21: Строка 22:
  
 
===Оперативный запас содержимого===
 
===Оперативный запас содержимого===
Content cache
+
{|class="wikitable" width=100%
    Static and dynamic content caching
+
|+ NGINX как oперативный запасник содержимого ([[content cache]])
Yes
+
|-
+
!Функционал!!NGINX Open Source!!Nginx Plus
Yes
+
|-
    Cache‑purging API
+
|Static and dynamic content caching||Yes||Yes
No
+
|-
+
|Cache‑purging API||No||Yes
Yes
+
|}
  
 
===Веб-сервер и обратный прокси===
 
===Веб-сервер и обратный прокси===
Web server and reverse proxy
+
{|class="wikitable" width=100%
    Origin server for static content
+
|+ NGINX как веб-сервер ([[web server]]) и обратный прокси ([[reverse proxy]])
Yes
+
!Функционал!!NGINX Open Source!!Nginx Plus
+
|-
Yes
+
|Origin server for static content||Yes||Yes
    Reverse proxy: HTTP, FastCGI, memcached, SCGI, uwsgi
+
|-
Yes
+
|Reverse proxy: HTTP, FastCGI, memcached, SCGI, uwsgi||Yes||Yes
+
|-
Yes
+
|HTTP/2 gateway||Yes||Yes
    HTTP/2 gateway
+
|-
Yes
+
|gRPC proxy||Yes||Yes
+
|-
Yes
+
|HTTP/2 server push||Yes||Yes
    gRPC proxy
+
|}
Yes
 
 
Yes
 
    HTTP/2 server push
 
Yes
 
 
Yes
 
  
 
===Управление безопасностью===
 
===Управление безопасностью===
Security controls
+
{|class="wikitable" width=100%
    HTTP Basic Authentication
+
|+ NGINX как проверяющий безопасность ([[security controls]])
Yes
+
|-
+
!Функционал!!NGINX Open Source!!Nginx Plus
Yes
+
|-
    HTTP authentication subrequests
+
|HTTP Basic Authentication||Yes||Yes
Yes
+
|-
+
|HTTP authentication subrequests||Yes||Yes
Yes
+
|-
    IP address‑based access control lists
+
|IP address‑based access control lists||Yes||Yes
Yes
+
|-
+
|Rate limiting||Yes||Yes
Yes
+
|-
    Rate limiting
+
|Dual‑stack RSA/ECC SSL/TLS offload||Yes||Yes
Yes
+
|-
+
|TLS 1.3 support||Yes||Yes
Yes
+
|-
    Dual‑stack RSA/ECC SSL/TLS offload
+
|JWT authentication||No||Yes
Yes
+
|-
+
|OpenID Connect single sign‑on (SSO)||No||Yes
Yes
+
|-
    TLS 1.3 support
+
|NGINX App Protect (additional cost)||No||Yes
Yes
+
|}
 
Yes
 
    JWT authentication
 
No
 
 
Yes
 
    OpenID Connect single sign‑on (SSO)
 
No
 
 
Yes
 
    NGINX App Protect (additional cost)
 
No
 
 
Yes
 
  
 
===Мониторинг===
 
===Мониторинг===
    Monitoring
+
{|class="wikitable" width=100%
    Export to external monitoring tools
+
|+ NGINX как инструмент наблюдения ([[monitoring]])
Yes
+
|-
+
!Функционал!!NGINX Open Source!!Nginx Plus
Yes
+
|-
    Built-in dashboard
+
|Export to external monitoring tools||Yes||Yes
No
+
|-
+
|Built-in dashboard||No||Yes
Yes
+
|-
    Extended status with 100+ additional metrics
+
|Extended status with 100+ additional metrics||No||Yes
No
+
|}
 
Yes
 
  
 
===Высокая доступность===
 
===Высокая доступность===
 
+
{|class="wikitable" width=100%
High availability (HA)
+
|+ NGINX как инструмент высокой доступности ([[high availability]] или [[HA]])
    Active‑active and active‑passive modes
+
|-
No
+
!Функционал!!NGINX Open Source!!Nginx Plus
+
|-
Yes
+
|Active‑active and active‑passive modes||No||Yes
    Configuration synchronization across cluster
+
|-
No
+
|Configuration synchronization across cluster||No||Yes
+
|-
Yes
+
|State sharing: sticky‑learn session persistence, rate limiting, key‑value stores||No||Yes
    State sharing: sticky‑learn session persistence, rate limiting, key‑value stores
+
|}
No
 
 
Yes
 
  
 
===Расположенность к программированию===
 
===Расположенность к программированию===
Programmability
+
{|class="wikitable" width=100%
    NGINX JavaScript module
+
|+ Расположенность NGINX к программированию ([[programmability]])
Yes
+
|-
+
!Функционал!!NGINX Open Source!!Nginx Plus
Yes
+
|-
    NGINX Plus API for dynamic reconfiguration
+
|NGINX JavaScript module||Yes||Yes
No
+
|-
+
|NGINX Plus API for dynamic reconfiguration||No||Yes
Yes
+
|-
    Key‑value store
+
|Key‑value store||No||Yes
No
+
|-
+
|Dynamic reconfiguration without process reloads||No||Yes
Yes
+
|}
    Dynamic reconfiguration without process reloads
 
No
 
 
Yes
 
  
 
===Трансляция видео и аудио===
 
===Трансляция видео и аудио===
Streaming media
+
{|class="wikitable" width=100%
    Live streaming: RTMP, HLS, DASH
+
|+ NGINX как инструмент трансляции видео и аудио ([[streaming media]])
Yes
+
|-
+
!Функционал!!NGINX Open Source!!Nginx Plus
Yes
+
|-
    VOD: Flash (FLV), MP4
+
|Live streaming: RTMP, HLS, DASH||Yes||Yes
Yes
+
|-
+
|VOD: Flash (FLV), MP4||Yes||Yes
Yes
+
|-
    Adaptive bitrate VOD: HLS, HDS
+
|Adaptive bitrate VOD: HLS, HDS||No||Yes
No
+
|-
+
|MP4 bandwidth controls||No||Yes
Yes
+
|}
    MP4 bandwidth controls
 
No
 
 
Yes
 
  
 
===Экосистемы третьих сторон===
 
===Экосистемы третьих сторон===
Third-party ecosystem
+
{|class="wikitable" width=100%
    Ingress controller
+
|+ Возможность работы NGINX в экосистемах третьих сторон ([[third-party ecosystem]])
Yes
+
|-
+
!Функционал!!NGINX Open Source!!Nginx Plus
Yes
+
|-
    OpenShift Router
+
|Ingress controller||Yes||Yes
Yes
+
|-
+
|OpenShift Router||Yes||Yes
Yes
+
|-
    Dynamic modules repository
+
|Dynamic modules repository||No||Yes
No
+
|}
 
Yes
 
Commercial support
 
No
 
 
Yes
 
 
 
https://www.nginx.com/products/nginx/compare-models
 
  
 
==Особенности==
 
==Особенности==

Текущая версия на 14:14, 12 августа 2022

NGINX (часто пишется строчными буквами, nginx; читается engine x, по-русски произносится как энджи́нкс или э́нжин-и́кс; здесь и далее -- NGINX) -- одно из двух изделий, NGINX Open Source с открытым кодом или коммерческое NGINX Plus, каждое из которых представляет собою инструмент обработки входящих запросов протоколов IP, HTTP, HTTPS, TCP, UDP. NGINX изначально разрабатывался для работы на Unix-подобных операционных системах.


Функциональность

Согласно https://www.nginx.com/products/nginx/compare-models.

Распределение нагрузки

NGINX как распределитель нагрузки (load balancer)
Функционал NGINX Open Source Nginx Plus
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

Оперативный запас содержимого

NGINX как oперативный запасник содержимого (content cache)
Функционал NGINX Open Source Nginx Plus
Static and dynamic content caching Yes Yes
Cache‑purging API No Yes

Веб-сервер и обратный прокси

NGINX как веб-сервер (web server) и обратный прокси (reverse proxy)
Функционал NGINX Open Source Nginx Plus
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

Управление безопасностью

NGINX как проверяющий безопасность (security controls)
Функционал NGINX Open Source Nginx Plus
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

Мониторинг

NGINX как инструмент наблюдения (monitoring)
Функционал NGINX Open Source Nginx Plus
Export to external monitoring tools Yes Yes
Built-in dashboard No Yes
Extended status with 100+ additional metrics No Yes

Высокая доступность

NGINX как инструмент высокой доступности (high availability или HA)
Функционал NGINX Open Source Nginx Plus
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

Расположенность к программированию

Расположенность NGINX к программированию (programmability)
Функционал NGINX Open Source Nginx Plus
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

Трансляция видео и аудио

NGINX как инструмент трансляции видео и аудио (streaming media)
Функционал NGINX Open Source Nginx Plus
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

Экосистемы третьих сторон

Возможность работы NGINX в экосистемах третьих сторон (third-party ecosystem)
Функционал NGINX Open Source Nginx Plus
Ingress controller Yes Yes
OpenShift Router Yes Yes
Dynamic modules repository No Yes

Особенности

В 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.