Nginx

Материал из Wikibrand
Nginx Inc.
Тип Частная компания
Дата основания 2011
Расположение США: Сан-Франциско, Калифорния
Продукция Nginx, Nginx Plus
Сайт http://nginx.com/

Nginx (engine x — произносится как энджи́нкс или э́нжин-и́кс) — Веб-сервер и почтовый Прокси-сервер, работающий на Unix-подобных операционных системах (тестировалась сборка и работа на FreeBSD, OpenBSD, Linux, Solaris, MacOS, AIX и HP-UX). С версии 0.7.52 существует экспериментальная сборка под Microsoft Windows.

Российский программист Игорь Сысоев начал разработку в 2002 году. Осенью 2004 года вышел первый публично доступный релиз. С июля 2011 работа над nginx продолжается в формате компании Nginx.

Основные функции

Nginx позиционируется производителем как простой, быстрый и надёжный сервер, не перегруженный функциями. Применение nginx целесообразно прежде всего для статических веб-сайтов и как обратного прокси-сервера перед динамическими сайтами.

HTTP-сервер: обслуживание неизменяемых запросов, индексных файлов, автоматическое создание списка файлов, Кэш дескрипторов открытых файлов; акселерированное проксирование без кэширования, простое распределение нагрузки и отказоустойчивость; поддержка кеширования при акселерированном проксировании и FastCGI; акселерированная поддержка FastCGI и Memcached-серверов, простое распределение нагрузки и отказоустойчивость; модульность, фильтры, в том числе сжатие (Gzip), byte-ranges (докачка), chunked-ответы, HTTP-Аутентификация, SSI-фильтр; несколько подзапросов на одной странице, обрабатываемых в SSI-фильтре через прокси или FastCGI, выполняются параллельно; поддержка SSL; поддержка PSGI, WSGI; экспериментальная поддержка встроенного Perl. SMTP/IMAP/POP3-прокси сервер: перенаправление пользователя на SMTP/IMAP/POP3-бэкенд с использованием внешнего HTTP-сервера аутентификации; простая аутентификация (LOGIN, USER/PASS); поддержка SSL и STARTTLS.

Архитектура

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

Популярность

По данным Netcraft на август 2020 года, число сайтов, обслуживаемых nginx, превышает 448 миллионов, что делает его первым по популярности Веб-сервером в мире. Доля среди активных сайтов — 19,74 %, что ставит nginx на второе место после веб-сервера Apache.

По данным W3Techs, nginx наиболее нередко применяется на высоконагруженных сайтах, занимая первое место по частоте использования среди 100 000 самых посещаемых сайтов в мире — больше трети из них работает на nginx. На 2017 год, по данным российского регистратора REG.RU, nginx является самым популярным веб-сервером доменных зон.ru,.рф и.su, обслуживая более половины каждого сегмента. nginx — самый популярный веб-сервер в России с долей рынка 65,90 %.

Среди популярных проектов, использующих nginx: Рамблер, Яндекс, ВКонтакте, Facebook, Netflix, Instagram, Mail.ru, Хабр, Живой Журнал, Avito.ru, Badoo, Ukr.net, Begun, Wordpress.com, SourceForge.net, Qiwi.com, Groupon, Rutracker.org, Pinterest, Tumblr, Superjob.ru, HeadHunter, 2ГИС, Orcatec — https://orcatec.com и многие другие.

Компания Nginx

Для разработки коммерческих продуктов Игорь Сысоев создал в июле 2011 года компанию Nginx. Разработка ведётся в офисе, находящемся в Москве, для продаж основана американская «дочка» — Nginx Inc. В феврале 2012 компания начала предоставлять платные услуги, были введены три пакета технической поддержки — Premium, Advanced и Essential, в рамках которых подписчики получали услуги по установке, настройке производительности, конфигурации, сопровождению, содействию в проектировании, окончательной оптимизации. В декабре 2011 года компания привлекла 3 млн долларов от пула инвесторов (в раунде лидировал фонд; соинвесторами выступили фонды Runa Capital и семейный фонд Майкла Делла.

В октябре 2013 компания привлекла ещё 10 млн долларов. Ведущим инвестором выступил фонд; соинвесторами выступили все фонды предыдущего раунда, а также Аарон Леви, глава Box.com.

9 декабря 2014 было объявлено о привлечении дополнительных инвестиций в размере 20 млн долларов. Возглавил раунд венчурный фонд New Enterprise Associates при участии фондов, Runa Capital, E.ventures (бывший BV Capital) и гендиректора Nginx Гуса Робертсона.

11 марта 2019 года компания F5 Networks объявила о покупке Nginx за 670 млн долларов, сделка была завершена 9 мая 2019 года.

12 декабря 2019 года стало известно, что корпорация Rambler (46,5 % которой принадлежит Сбербанку России) заявила исключительные права на исходные тексты nginx, отдельные СМИ сообщали о проведении обыска в офисе компании Nginx и об уголовном деле по ст. 146 УК РФ (Нарушение авторских и смежных прав). 18 мая 2020 года дело прекращено по пункту 1 части 1 статьи 24 УПК РФ (отсутствие события преступления).

18 января 2022 года было объявлено, что Игорь Сысоев покидает Nginx и F5.

В конце 2022 года часть бывших разработчиков Nginx выпустила Angie, Форк Nginx с открытым исходным кодом; Игорь Сысоев в работе над этим проектом участия не принимает.

См. также

Событийно-ориентированное программирование HAProxy

Примечания

  • Комментарии
  • Источники

Ссылки