Что такое nginx и зачем он нужен
Nginx
Nginx (eNGIne X, «Энджинкс» или «Энджин-икс») — это программное обеспечение с открытым исходным кодом для создания легкого и мощного веб-сервера. Также его используют в качестве почтового или обратного прокси-сервера. Nginx решает проблему падения производительности с ростом трафика и является самым популярным веб-сервером в России и вторым в мире.
Nginx разработал Игорь Сысоев, системный администратор «Рамблера», в 2002 году, чтобы решить проблему с проседанием под нагрузкой. В 2004 году продукт стал доступен для широкого круга пользователей и получил одобрение. С 2011 года выпуском занимается собственная фирма Игоря, которая через 2 года представила расширенную платную версию продукта (Nginx Plus).
Сейчас Nginx обслуживает соединения, обрабатывает запросы, которые поступают к серверу, а также используется:
Особенности Nginx
Высокая скорость
Особенно заметна при работе со статическим контентом, который не нужно постоянно обновлять. Когда пользователь загружает страницу сайта, сначала веб-сервер Nginx кэширует данные у себя, а потом возвращает результат. При следующих запросах страницы ответ происходит в несколько раз быстрее.
Гибкость
Программное обеспечение гибко конфигурируется и настраивается под потребности инфраструктуры.
Малое потребление памяти
Чтобы уменьшить нагрузку на оперативную память, Nginx использует выделенный сегмент памяти — «пул» (pool). Он динамический и может расширяться при увеличении длины запроса.
Хорошая поддержка
У Nginx активное комьюнити и хорошая клиентская поддержка, а документация доступна и на русском языке.
Доступность
Программа бесплатная и распространяется по свободной лицензии. У нее открытый программный код, поэтому любой разработчик может адаптировать Nginx под себя.
Станьте универсальным специалистом по администрированию Linux с нуля и разверните собственный кластер.
Как работает Nginx
Когда пользователь совершает действие на странице, информация передается на сервер. Он находит файлы, передает сведения.
Если обрабатывать запросы каждого пользователя по отдельности, серверу придется одновременно выполнять много процессов. Сайт начнет работать медленно. Nginx позволяет обойти ограничение. Его архитектура асинхронная: все запросы обрабатываются на разных этапах, что повышает скорость обработки.
Запросы от одного пользователя разбиваются на маленькие структуры — сетевые соединения. Обработка происходит быстрее: за однотипные действия отвечает один процесс. После обработки соединения собираются в одном виртуальном контейнере, чтобы преобразоваться в единый первоначальный запрос, а затем отправляются пользователю. Благодаря такому принципу работы Nginx одно сетевое соединение может обслуживать до 1024 запросов.
Для каких ОС подходит Nginx
Nginx работает на серверах, где установлены ОС на базе UNIX, включая Linux, MacOS, FreeBSD и OpenBSD. Поддержка Windows и подобных систем ограничена, но все же присутствует. ПО написано на базе UNIX-подобной операционной системы.
Что выбрать: Nginx или Apache
Apache — главный конкурент Nginx. Существует дольше, поэтому имеет более крупное комьюнити. Работать с Apache легче за счет простой архитектуры и полноценной поддержки Windows. При работе с динамическим контентом показывает такую же производительность, как Nginx. Но статический контент Nginx обрабатывает в 2,5 раза быстрее, потребляя при этом меньше памяти.
Nginx может работать в связке с Apache. Если запрос приходит на выдачу статического материала, его обрабатывает Nginx. Если пользователю нужен динамический контент (графика, видео), подключается Apache.
Станьте универсальным junior-специалистом по Linux с нуля или отточите уже имеющиеся навыки.
Nginx — быстрый, дерзкий и суперпопулярный сервер
Мы постепенно рассказываем о веб-серверах — это программы, которые отвечают за то, чтобы нам выдавались сайты. В прошлой серии показывали Apache — один из первых массовых веб-серверов, который до сих пор работает в огромном количестве компьютеров. А сегодня — новое поколение.
Короткая предыстория
Главная проблема веб-сервера Apache, про который мы говорили прошлый раз, — это падение производительности с ростом трафика. Чем больше людей заходят на сайт, тем хуже он справляется. Решения на тот момент были такие:
И то и другое — дорого. Чтобы решить эту проблему, в 2002 году системный администратор Игорь Сысоев начал разрабатывать собственный веб-сервер, который сможет решить проблему с проседанием под нагрузкой. Тогда Игорь работал в «Рамблере».
Через два года вышел первый релиз его веб-сервера Nginx. Сейчас это самый популярный веб-сервер в России и в тройке самых известных — в мире.
Архитектура
Apache работает так: все запросы, которые попадают на этот сервер, обслуживаются до тех пор, пока не будет дан полный ответ на запрос. Это значит, что если для ответа нужно будет попросить движок сайта собрать новую страницу, то Apache даст задание движку, а сам будет ждать ответ, пока не дождётся. Когда запросов много, сервер начинает тратить свои ресурсы на простой и ожидания, а не на реальную работу.
В Nginx всё устроено немного иначе:
Получается, что так как Nginx не тратит время на ожидание результата, то он может одновременно обрабатывать гораздо больше запросов, чем Apache. В этом и есть суперсила Nginx.
В чём ещё отличия от Apache
Документация. У Apache документации, форумов и примеров гораздо больше, потому что проект начался на 7 лет раньше и все материалы сразу были на английском — стандартном языке для всех программистов.
Nginx появился позже и в России, поэтому почти вся документация изначально была на русском. Из-за этого разработчикам из других стран было трудно использовать Nginx, но со временем ситуация выровнялась: сейчас проект ведётся одновременно на русском и на английском языках.
Работа с модулями. В Apache всё просто: прописал название модуля и веб-сервер сразу его подгрузил и начал использовать. Не нужно — выгрузил, тоже на ходу. Это позволяет очень гибко настраивать поведение сервера в разные моменты времени.
Чтобы добавить модули в Nginx, их нужно выбрать заранее и скомпилировать вместе с ядром сервера. С одной стороны, это неудобно: нужно на старте чётко представлять, что будет делать сервер и в каких ситуациях. Но с другой — это повышает безопасность: не получится на лету подключить какой-то неизвестный и непроверенный модуль, в котором будет дыра в безопасности.
Nginx + Apache = ❤️
Может показаться, что Nginx и Apache воюют друг с другом за долю рынка, но на самом деле они отлично работают вместе:
Получается так: Nginx занимается самыми простыми запросами, которые можно выполнить моментально, а всю динамику и сборки отправляет в Apache и продолжает заниматься своими делами.
В итоге польза всем: пока Apache ждёт или собирает страницы, Nginx успевает переделать кучу дел и не тратит своё время на ожидание. Системные администраторы часто используют такую связку, чтобы сбалансировать нагрузку на сервер и более эффективно использовать ресурсы.
Кто использует
Если вы назовёте три любых крупных ИТ-компании, то две из них точно будут использовать Nginx. В этом можно легко убедиться самому, посмотрев на список тех проектов, где используют эту программу:
Причина такой популярности — в скорости работы, надёжности и универсальности Nginx. К нему можно прикрутить почти любой софт и получить любую конфигурацию ответов на запросы.
Конфликт с «Рамблером»
В 2019 году произошла такая история: Рамблер заявил, что раз Сысоев во время создания Nginx работал у них, то и все права на этот веб-сервер тоже принадлежат им. В итоге завели дело по статье о нарушении авторских прав, а Рамблер требовал возместить им ущерб в 50 миллионов рублей.
Через полгода уголовное дело прекратили за отсутствием состава преступления: компания не смогла найти подтверждения своим словам и не смогла получить права на код Nginx.
По иронии судьбы на Nginx сейчас работают серверы и самого Рамблера 🙂
NGINX изнутри: рожден для производительности и масштабирования
NGINX вполне заслуженно является одним из лучших по производительности серверов, и всё это благодаря его внутреннему устройству. В то время, как многие веб-серверы и серверы приложений используют простую многопоточную модель, NGINX выделяется из общей массы своей нетривиальной событийной архитектурой, которая позволяет ему с легкостью масштабироваться до сотен тысяч параллельных соединений.
Инфографика Inside NGINX сверху вниз проведет вас по азам устройства процессов к иллюстрации того, как NGINX обрабатывает множество соединений в одном процессе. Данная статья рассмотрит всё это чуть более детально.
Подготавливаем сцену: модель NGINX процессов
Чтобы лучше представлять устройство, сперва необходимо понять как NGINX запускается. У NGINX есть один мастер-процесс (который от имени суперпользователя выполняет такие операции, как чтение конфигурации и открытие портов), а также некоторое количество рабочих и вспомогательных процессов.
На 4-х ядерном сервере мастер-процесс NGINX создает 4 рабочих процесса и пару вспомогательных кэш-процессов, которые управляют содержимым кэша на жестком диске.
Почему архитектура всё же важна?
Одна из фундаментальных основ любого Unix-приложения — это процесс или поток (с точки зрения ядра Linux процессы и потоки практически одно и то же — вся разница в разделении адресного пространства). Процесс или поток — это самодостаточный набор инструкций, который операционная система может запланировать для выполнения на ядре процессора. Большинство сложных приложений параллельно запускают множество процессов или потоков по двум причинам:
Наиболее типичный подход к построению сетевого приложения — это выделять для каждого соединения отдельный процесс или поток. Такая архитектура проста для понимания и легка в реализации, но при этом плохо масштабируется когда приложению приходится работать с тысячами соединений одновременно.
Как же работает NGINX?
NGINX использует модель с фиксированным числом процессов, которая наиболее эффективно задействует доступные ресурсы системы:
Когда NGINX находится под нагрузкой, то в основном заняты рабочие процессы. Каждый из них обрабатывает множество соединений в неблокирующемся режиме, минимизируя количество переключений контекста.
Каждый рабочий процесс однопоточен и работает независимо, принимая новые соединения и обрабатывая их. Процессы взаимодействуют друг с другом используя разделяемую память для данных кэша, сессий и других общих ресурсов.
Внутри рабочего процесса
Каждый рабочий процесс NGINX инициализируется с заданной конфигурацией и набором слушающих сокетов, унаследованных от мастер-процесса.
Рабочие процессы начинают с ожидания событий на слушающих сокетах (см. также accept_mutex и разделяемые сокеты). События извещают о новых соединениях. Эти соединения попадают в конечный автомат — наиболее часто используемый предназначен для обработки HTTP, но NGINX также содержит конечные автоматы для обработки потоков TCP трафика (модуль stream) и целого ряда протоколов электронной почты (SMTP, IMAP и POP3).
Конечный автомат в NGINX по своей сути является набором инструкций для обработки запроса. Большинство веб-серверов выполняют такую же функцию, но разница кроется в реализации.
Устройство конечного автомата
Конечный автомат можно представить себе в виде правил для игры в шахматы. Каждая HTTP транзакция — это шахматная партия. С одной стороны шахматной доски веб-сервер — гроссмейстер, который принимает решения очень быстро. На другой стороне — удаленный клиент, браузер, который запрашивает сайт или приложение по относительно медленной сети.
Как бы то ни было, правила игры могут быть очень сложными. Например, веб-серверу может потребоваться взаимодействовать с другими ресурсами (проксировать запросы на бэкенд) или обращаться к серверу аутентификации. Сторонние модули способны ещё сильнее усложнить обработку.
Блокирующийся конечный автомат
Вспомните наше определение процесса или потока, как самодостаточного набора инструкций, выполнение которых операционная система может назначать на конкретное ядро процессора. Большинство веб-серверов и веб-приложений используют модель, в которой для «игры в шахматы» приходится по одному процессу или потоку на соединение. Каждый процесс или поток содержит инструкции, чтобы сыграть одну партию до конца. Все это время процесс, выполняясь на сервере, проводит большую часть времени заблокированным в ожидании следующего хода от клиента.
NGINX, как настоящий Гроссмейстер
Вероятно вы слышали о сеансах одновременной игры, когда один гроссмейстер играет на множестве шахматных полей сразу с десятками противников?
Кирил Георгиев на турнире в Болгарии сыграл параллельно 360 партий. Его итоговый результат составил: 284 победы, 70 вничью и 6 поражений.
Таким же образом рабочий процесс NGINX «играет в шахматы». Каждый рабочий процесс (помните — обычно всего один на вычислительное ядро) является гроссмейстером, способным играть сотни (а на самом деле сотни тысяч) партий одновременно.
Почему так получается быстрее, чем блокирующаяся многопоточная архитектура?
Каждое новое соединение создает файловый дескриптор и потребляет небольшой объем памяти в рабочем процессе. Это очень малые накладные расходы на соединение. Процессы NGINX могут оставаться привязанными к конкретным ядрам процессора. Переключения контекста происходят достаточно редко и в основном когда не осталось больше работы.
В блокирующемся подходе, с отдельным процессом на каждое соединение, требуется сравнительно большой объем дополнительных ресурсов, и переключения контекста с одного процесса на другой происходят гораздо чаще.
Дополнительную информацию по теме можно также узнать из статьи об архитектуре NGINX от Андрея Алексеева, вице-президента по развитию и сооснователя компании NGINX, Inc.
С адекватной настройкой системы, NGINX прекрасно масштабируется до многих сотен тысяч параллельных HTTP cоединений на каждый рабочий процесс и уверенно поглощает всплески трафика (толпы новых игроков).
Обновление конфигурации и исполняемого кода
Архитектура NGINX с малым количеством рабочих процессов позволяет достаточно эффективно обновлять конфигурацию и даже его собственный исполняемый код на лету.
Обновление конфигурации NGINX — очень простая, легковесная и надежная процедура. Она заключается в простой отправке мастер-процессу сигнала SIGHUP.
Обновление исполняемого кода NGINX — это Святой Грааль высокой доступности сервисов. Вы можете обновлять сервер на лету, без потери соединений, простоя ресурсов и каких-либо перерывов в обслуживании клиентов.
Процесс обновления исполняемого кода использует схожий с перезагрузкой конфигурации подход. Новый мастер-процесс NGINX запускается параллельно со старым и получает от него дескрипторы слушающих сокетов. Оба процесса загружены и их рабочие процессы обрабатывают трафик. Затем вы можете отдать команду старому мастер-процессу на плавное завершение.
Вся процедура подробно описана в документации.
Подведем итоги
Мы дали поверхностный обзор того, как функционирует NGINX. Под этими простыми описаниями скрывается более чем десятилетний опыт разработки и оптимизации, который позволяет NGINX демонстрировать выдающуюся производительность на широком спектре оборудования и реальных задачах, оставаясь надежным и безопасным, как того требуют современные веб-приложения.
Если вы хотите узнать больше по данной теме, то рекомендуем для ознакомления:
Что такое Nginx
В этой статье мы расскажем, что такое Nginx, как он работает, какие у него плюсы и минусы.
Nginx ― это программное обеспечение с открытым исходным кодом, которое позволяет создавать веб-сервер. Также его используют как почтовый сервер или обратный прокси-сервер.
Для начала разбёрем, что такое веб-сервер. Веб-сервер — это программное обеспечение, основная задача которого — обработка входящих и исходящих запросов на различных протоколах передачи данных. Рассмотрим этот процесс на примере веб-сайтов. После того как вы ввели URL-адрес сайта в адресной строке, браузер обращается к веб-серверу путём передачи запроса по протоколу HTTP. Веб-сервер выполняет некий набор инструкций, указанный в конфигах, и возвращает по HTTP ответ, например со статическими страницами сайта или данными для редиректа. Таким образом, веб-сервер ― это связующее звено между браузером и сервером. Зачем нужен Nginx?
Nginx работает почти на всех Linux и Unix подобных системах, а также на некоторых версиях Windows.
Как работает Nginx
Есть 2 алгоритма работы― синхронный и асинхронный. При синхронном алгоритме для каждого этапа задачи выделяется отдельный поток и вся операция выполняется шаг за шагом, то есть программа не переходит к следующему шагу, пока не закончит предыдущий. Таким образом, некоторые элементы системы периодически простаивают, пока ждут, когда придёт их очередь. Отсюда два недостатка такой системы:
По такому принципу работает, например, веб-сервер Apache.
Асинхронный алгоритм решил проблемы, перечисленные выше. При асинхронном алгоритме код по-прежнему выполняет всё шаг за шагом, но при этом системе необязательно ждать завершения одного этапа, чтобы перейти к следующему. Все задачи идут в одном потоке. Программа всегда в курсе всего процесса в целом и может переходить к следующему этапу, когда предыдущий еще не завершён. По асинхронному алгоритму работает Nginx. Благодаря такому подходу работа с Nginx позволяет:
Несмотря на плюсы Nginx и его асинхронного алгоритма, есть один минус ― блокирующие операции. Бывает так, что среди параллельно выполняющихся маленьких операций есть одна, которая задерживает весь поток. Например, весь поток может ждать ответа от жёсткого диска для одного из этапов. Это похоже на очередь в кассе супермаркета. Какое-то время вся система идёт чётко. Один человек оплачивает, второй уже выкладывает товар на ленту, кассир пробивает товар, параллельно покупатель складывает пробитый товар в пакет. Вдруг на пакете с помидорами нет штрих-кода. Покупатель бежит взвешивать. Вся очередь стоит. Процесс остановлен.
Для решения этой проблемы в версии Nginx 1.7.11 был создан новый механизм ― пул потоков. Когда в процессе нужно выполнить потенциально долгую операцию, она помещается в отдельный поток, чтобы не задерживать все остальные. В нашем примере с кассой не покупатель бы побежал взвешивать помидоры, а работник супермаркета. Пока он взвешивал помидоры, кассир продолжал бы пробивать товары, а покупатель складывать их.
Подробнее о том, как произвести установку и начальное администрирование Nginx, можно узнать в статьях:
Что Такое NGINX? И Как Оно Работает?
Что таоке NGINX? NGINX (англ), произносится как «енджин-екс», является известным программным обеспечением с открытым исходным кодом для веб-сервера. В своём первоначальном выпуске оно функционировало для веб-обслуживания HTTP. Однако сегодня оно также служит обратным прокси-сервером, балансировщиком нагрузки HTTP и почтовым прокси-сервером для IMAP, POP3 и SMTP.
Официальный выпуск NGINX состоялся в октябре 2004 года. Создатель программного обеспечения, Игорь Сысоев, начал свой проект в 2002 году, пытаясь ответить на проблему C10k. C10k — это задача одновременного управления десятью тысячами соединений. Сегодня существует ещё больше подключений, которые должны обрабатывать веб-серверы. По этой причине NGINX предлагает управляемую событиями и асинхронную архитектуру. Эта функция делает NGINX одним из самых надёжных ПО для серверов по скорости и масштабируемости.
Благодаря превосходной способности обрабатывать большое количество соединений и скорости, многие сайты с высоким трафиком используют сервис NGINX. Некоторые из этих онлайн-гигантов — Google, Netflix, Adobe, Cloudflare, WordPress.com и многие другие.
Как работает NGINX?
Прежде чем узнать больше о NGINX, давайте посмотрим, как работает веб-сервер. Когда кто-то делает запрос на открытие веб-страницы, браузер связывается с сервером этого веб-сайта. Затем сервер ищет запрошенные файлы для страницы и отправляет их в браузер. Это только самый простой вид запроса.
Приведённый выше пример также рассматривается как один поток. Традиционные веб-серверы создают отдельный поток для каждого запроса, но NGINX не работает таким образом. Как указано выше, NGINX работает с асинхронной архитектурой, управляемой событиями. Это означает, что аналогичные потоки управляются одним рабочим процессом, и каждый рабочий процесс содержит меньшие блоки, называемые рабочими соединениями. Весь этот блок отвечает за обработку потоков запросов. Рабочие соединения доставляют запросы к рабочему процессу, который также отправляет его в главный процесс. Наконец, основной процесс предоставляет результат этих запросов.
Это может показаться простым, но одно рабочее соединение может обрабатывать до 1024 похожих запросов. Благодаря этому NGINX может без проблем обрабатывать тысячи запросов. Это также причина, по которой NGINX отлично подходит для загруженных веб-сайтов, таких как интернет-магазины, поисковые системы и облачное хранилище.
Прежде чем читать дальше, подумайте о самой инновационной структуре хостинга, которая может понадобиться для вашего сайта. Hostinger предлагает общий, VPS и облачный хостинг для небольших и готовых к росту веб-сайтов.
NGINX или Apache
Среди популярных веб-серверов Apache является одним из главных конкурентов NGINX. Он существует с 90-х годов и имеет большое сообщество пользователей. Если вам интересно, какой веб-сервер лучше всего подходит для ваших нужд, взгляните на это краткое и информативное сравнение между NGINX и Apache.
Поддержка ОС
Совместимость — это одна из маленьких деталей, которую следует учитывать при выборе программного обеспечения. И NGINX, и Apache могут работать во многих операционных системах, поддерживающих систему Unix. К сожалению, производительность NGINX в Windows не так велика, как на других платформах.
Поддержка пользователей
Пользователям, от новичков до профессионалов, всегда нужно хорошее сообщество, которое может помочь, когда они сталкиваются с проблемами. Хотя и NGINX, и Apache имеют поддержку по почте и форум по переполнению стека, Apache не хватает поддержки со стороны его компании, Apache Foundation.
Производительность
NGINX может одновременно выполнять 1000 подключений статического контента в два раза быстрее, чем Apache, и использует немного меньше памяти. Однако при сравнении их производительности при работе с динамическим контентом обе имеют одинаковую скорость. NGINX это лучший выбор для тех, у кого более статичный сайт.
Заключение
Что таоке NGINX? NGINX это веб-сервер, который также выступает в качестве прокси-сервера электронной почты, обратного прокси-сервера и балансировщика нагрузки. Структура программного обеспечения является асинхронной и управляемой событиями, что позволяет обрабатывать много запросов одновременно. NGINX также хорошо масштабируется, а это означает, что его сервис растёт вместе с трафиком клиентов. NGINX и Apache действительно являются двумя лучшими веб-серверами на рынке.
Анна долгое время работала в сфере социальных сетей и меседжеров, но сейчас активно увлеклась созданием и сопровождением сайтов. Она любит узнавать что-то новое и постоянно находится в поиске новинок и обновлений, чтобы делиться ими с миром. Ещё Анна увлекается изучением иностранных языков. Сейчас её увлёк язык программирования!