# Nginx

**nginx \[engine x]** — это HTTP-сервер и обратный прокси-сервер, почтовый прокси-сервер, а также TCP/UDP прокси-сервер общего назначения, изначально написанный [Игорем Сысоевым](http://sysoev.ru/). Уже длительное время он обслуживает серверы многих высоконагруженных российских сайтов, таких как Яндекс, Mail.Ru, ВКонтакте и Рамблер. Согласно статистике Netcraft nginx обслуживал или проксировал 21.18% самых нагруженных сайтов в мае 2023 года. Вот некоторые примеры успешного внедрения nginx (тексты на английском языке): [Dropbox](https://blogs.dropbox.com/tech/2017/09/optimizing-web-servers-for-high-throughput-and-low-latency/), [Netflix](https://openconnect.netflix.com/en/software/), [Wordpress.com](https://www.nginx.com/case-studies/nginx-wordpress-com/), [FastMail.FM](http://blog.fastmail.fm/2007/01/04/webimappop-frontend-proxies-changed-to-nginx/).

Исходные тексты и документация распространяются под BSD-подобной лицензией из 2 пунктов.

Коммерческая поддержка осуществляется компанией Nginx, Inc.

**Основная функциональность HTTP-сервера**

* Обслуживание статических запросов, индексных файлов, автоматическое создание списка файлов, кэш дескрипторов открытых файлов;
* Акселерированное обратное проксирование с кэшированием, распределение нагрузки и отказоустойчивость;
* Акселерированная поддержка FastCGI, uwsgi, SCGI и memcached серверов с кэшированием, распределение нагрузки и отказоустойчивость;
* Модульность, фильтры, в том числе сжатие (gzip), byte-ranges (докачка), chunked ответы, XSLT-фильтр, SSI-фильтр, преобразование изображений; несколько подзапросов на одной странице, обрабатываемые в SSI-фильтре через прокси или FastCGI/uwsgi/SCGI, выполняются параллельно;
* Поддержка SSL и расширения TLS SNI;
* Поддержка HTTP/2 с приоритизацией на основе весов и зависимостей;
* Поддержка HTTP/3.

**Другие возможности HTTP-сервера**

* Виртуальные серверы, определяемые по IP-адресу и имени;
* Поддержка keep-alive и pipelined соединений;
* Настройка форматов логов, буферизованная запись в лог, быстрая ротация логов, запись в syslog;
* Специальные страницы для ошибок 3xx-5xx;
* rewrite-модуль: изменение URI с помощью регулярных выражений;
* Выполнение разных функций в зависимости от адреса клиента;
* Ограничение доступа в зависимости от адреса клиента, по паролю (HTTP Basic аутентификация) и по результату подзапроса;
* Проверка HTTP referer;
* Методы PUT, DELETE, MKCOL, COPY и MOVE;
* FLV и MP4 стриминг;
* Ограничение скорости отдачи ответов;
* Ограничение числа одновременных соединений и запросов с одного адреса;
* Геолокация по IP-адресу;
* A/B-тестирование;
* Зеркалирование запросов;
* Встроенный Perl;
* сценарный язык njs.

**Функциональность почтового прокси-сервера**

* Перенаправление пользователя на IMAP- или POP3-сервер с использованием внешнего HTTP-сервера аутентификации;
* Проверка пользователя с помощью внешнего HTTP-сервера аутентификации и перенаправление соединения на внутренний SMTP-сервер;
* Методы аутентификации:
  * POP3: USER/PASS, APOP, AUTH LOGIN/PLAIN/CRAM-MD5;
  * IMAP: LOGIN, AUTH LOGIN/PLAIN/CRAM-MD5;
  * SMTP: AUTH LOGIN/PLAIN/CRAM-MD5;
* Поддержка SSL;
* Поддержка STARTTLS и STLS.

**Функциональность TCP/UDP прокси-сервера**

* Проксирование TCP и UDP;
* Поддержка SSL и расширения TLS SNI для TCP;
* Распределение нагрузки и отказоустойчивость;
* Ограничение доступа в зависимости от адреса клиента;
* Выполнение разных функций в зависимости от [адреса клиента](https://nginx.org/ru/docs/http/ngx_http_geo_module.html);
* Ограничение числа одновременных соединений с одного адреса;
* Настройка форматов логов, буферизованная запись в лог, быстрая ротация логов, запись в syslog;
* Геолокация по IP-адресу;
* A/B-тестирование;
* сценарный язык njs.

**Архитектура и масштабируемость**

* Один главный и несколько рабочих процессов, рабочие процессы работают под непривилегированным пользователем;
* Гибкость конфигурации;
* Изменение настроек и обновление исполняемого файла без перерыва в обслуживании клиентов;
* Поддержка kqueue (FreeBSD 4.1+), epoll (Linux 2.6+), /dev/poll (Solaris 7 11/99+), event ports (Solaris 10), select и poll;
* Использование возможностей, предоставляемых kqueue, таких как EV\_CLEAR, EV\_DISABLE (для временного выключения события), NOTE\_LOWAT, EV\_EOF, число доступных данных, коды ошибок;
* Использование возможностей, предоставляемых epoll, таких как EPOLLRDHUP (Linux 2.6.17+, glibc 2.8+) и EPOLLEXCLUSIVE (Linux 4.5+, glibc 2.24+);
* Поддержка sendfile (FreeBSD 3.1+, Linux 2.2+, macOS 10.5+), sendfile64 (Linux 2.4.21+) и sendfilev (Solaris 8 7/01+);
* Поддержка файлового AIO (FreeBSD 4.3+, Linux 2.6.22+);
* Поддержка DIRECTIO (FreeBSD 4.4+, Linux 2.4+, Solaris 2.6+, macOS);
* Поддержка accept-фильтров (FreeBSD 4.1+, NetBSD 5.0+) и TCP\_DEFER\_ACCEPT (Linux 2.4+);
* На 10 000 неактивных HTTP keep-alive соединений расходуется около 2.5M памяти;
* Минимум операций копирования данных.

{% embed url="<https://nginx.org/ru/>" %}

{% embed url="<https://habr.com/ru/articles/320710/>" %}
