что такое nginx и зачем он нужен
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. В этом руководстве описывается, как запустить и остановить nginx и перезагрузить его конфигурацию, объясняется, как устроен конфигурационный файл, и описывается, как настроить nginx для раздачи статического содержимого, как настроить прокси-сервер на nginx, и как связать nginx с приложением FastCGI.
У nginx есть один главный и несколько рабочих процессов. Основная задача главного процесса — чтение и проверка конфигурации и управление рабочими процессами. Рабочие процессы выполняют фактическую обработку запросов. nginx использует модель, основанную на событиях, и зависящие от операционной системы механизмы для эффективного распределения запросов между рабочими процессами. Количество рабочих процессов задаётся в конфигурационном файле и может быть фиксированным для данной конфигурации или автоматически устанавливаться равным числу доступных процессорных ядер (см. worker_processes).
Запуск, остановка, перезагрузка конфигурации
Где сигнал может быть одним из нижеследующих:
Например, чтобы остановить процессы nginx с ожиданием окончания обслуживания текущих запросов рабочими процессами, можно выполнить следующую команду:
Команда должна быть выполнена под тем же пользователем, под которым был запущен nginx.
Изменения, сделанные в конфигурационном файле, не будут применены, пока команда перезагрузить конфигурацию не будет вручную отправлена nginx’у или он не будет перезапущен. Для перезагрузки конфигурации выполните:
Получив сигнал, главный процесс проверяет правильность синтаксиса нового конфигурационного файла и пытается применить конфигурацию, содержащуюся в нём. Если это ему удаётся, главный процесс запускает новые рабочие процессы и отправляет сообщения старым рабочим процессам с требованием завершиться. В противном случае, главный процесс откатывает изменения и продолжает работать со старой конфигурацией. Старые рабочие процессы, получив команду завершиться, прекращают принимать новые запросы и продолжают обслуживать текущие запросы до тех пор, пока все такие запросы не будут обслужены. После этого старые рабочие процессы завершаются.
Дополнительную информацию об отправке сигналов процессам nginx можно найти в Управление nginx.
Структура конфигурационного файла
nginx состоит из модулей, которые настраиваются директивами, указанными в конфигурационном файле. Директивы делятся на простые и блочные. Простая директива состоит из имени и параметров, разделённых пробелами, и оканчивается точкой с запятой ( ; ). Блочная директива устроена так же, как и простая директива, но вместо точки с запятой после имени и параметров следует набор дополнительных инструкций, помещённых внутри фигурных скобок ( < и >). Если у блочной директивы внутри фигурных скобок можно задавать другие директивы, то она называется контекстом (примеры: events, http, server и location).
Часть строки после символа # считается комментарием.
Раздача статического содержимого
Во-первых, создайте каталог /data/www и положите в него файл index.html с любым текстовым содержанием, а также создайте каталог /data/images и положите в него несколько файлов с изображениями.
В блок server добавьте блок location следующего вида:
Далее, добавьте второй блок location :
Он будет давать совпадение с запросами, начинающимися с /images/ ( location / для них тоже подходит, но указанный там префикс короче).
Итоговая конфигурация блока server должна выглядеть следующим образом:
Чтобы применить новую конфигурацию, запустите nginx, если он ещё не запущен, или отправьте сигнал reload главному процессу nginx, выполнив:
Настройка простого прокси-сервера
Одним из частых применений nginx является использование его в качестве прокси-сервера, то есть сервера, который принимает запросы, перенаправляет их на проксируемые сервера, получает ответы от них и отправляет их клиенту.
Мы настроим базовый прокси-сервер, который будет обслуживать запросы изображений из локального каталога и отправлять все остальные запросы на проксируемый сервер. В этом примере оба сервера будут работать в рамках одного экземпляра nginx.
Во-первых, создайте проксируемый сервер, добавив ещё один блок server в конфигурационный файл nginx со следующим содержимым:
Далее, используйте конфигурацию сервера из предыдущего раздела и видоизмените её, превратив в конфигурацию прокси-сервера. В первый блок location добавьте директиву proxy_pass, указав протокол, имя и порт проксируемого сервера в качестве параметра (в нашем случае это http://localhost:8080 ):
Итоговая конфигурация прокси-сервера выглядит следующим образом:
Чтобы применить новую конфигурацию, отправьте сигнал reload nginx’у, как описывалось в предыдущих разделах.
Существует множество других директив для дальнейшей настройки прокси-соединения.
Настройка проксирования FastCGI
nginx можно использовать для перенаправления запросов на FastCGI-серверы. На них могут исполняться приложения, созданные с использованием разнообразных фреймворков и языков программирования, например, PHP.
Что такое Nginx
Содержание:
Nginx — мощный инструмент для развертывания веб-сервера, который при правильной настройке превосходит Apache. Области применения Nginx весьма обширны — от кэширования HTTP до создания инвертированного прокси-сервера.
Сейчас Nginx обслуживает примерно 30,8% всех существующих сайтов мира, о чьих веб-серверах есть информация в открытом доступе. Понимание, что из себя представляет Nginx и как этот программный продукт можно применять на практике, помогает эффективно решать задачи во многих областях IT-индустрии.
В этой статье рассмотрим принцип работы Nginx, а также его функционал, отличия от Apache и способ установки на конкретную ОС.
Что такое Nginx
Nginx (NGINX, Engine-X, «Энжин-кс») — это бесплатный веб- и почтовый прокси-сервер с непоточной (асинхронной) архитектурой и открытым кодом.
Nginx работает на ОС Unix-типа и был успешно протестирован на OpenBSD, FreeBSD, Linux, Mac OS X, Solaris. На ОС Windows он стал доступен после выпуска бинарной сборки 0,7.52.
На данный момент функционалом пользуются такие известные платформы: Rambler, Begun, Yandex, SourceForge.net, WordPress.com, vkontakte.ru. Статистика показывает, что Nginx используют 22,3 млн веб-сайтов и 2,03 млн дополнительных активных сайтов.
Как работает Nginx
В отличие от обычного веб-сервера, Nginx не создаёт один поток под каждый запрос, а разделяет его на меньшие однотипные структуры, называемые рабочими соединениями. Каждое такое соединение обрабатывается отдельным рабочим процессом, а после выполнения они сливаются в единый блок, возвращающий результат в основной процесс обработки данных. Одно рабочее соединение может обрабатывать до 1024 запросов одного вида одновременно.
Практическое применение
NGINX vs Apache
Веб-сервер Nginx по сравнению с Apache работает быстрее при отдаче статики и потребляет меньше серверных ресурсов. Его использует вместо или совместно с Apache для ускорения обработки запросов и уменьшения нагрузки. Это обуславливается тем, что большая часть тех возможностей, которые предлагает Apache, большинству обычных пользователей не нужно.
Поскольку широкий функционал Nginx требует и значительно больших ресурсов системы, постоянно применять полноценную связку «Nginx + Apache» нецелесообразно. Чаще оба веб-сервера используются в симбиозе — Nginx отдает статику и перенаправляет обработку скриптов Apache.
Нужно, чтобы Nginx и Apache работали без сбоев? Мощный VPS от Eternalhost позволит сохранить оптимальную производительность, даже при пиковых нагрузках.
Сильные и слабые стороны
Архитектура и конфигурация Nginx
Установка на Linux возможна двумя способами — из предварительно собранного бинарного файла (пакета) или с помощью исходного кода.
Первый способ самый простой, но второй позволяет подключить различные дополнительные модули, расширяющие возможности сервера. Установка с помощью исходного кода применяется сравнительно редко, поэтому ее особенности рассматривать здесь не будем.
Установка Nginx на Windows возможна с помощью интерфейса Win32 API. Однако, такой вариант будет гораздо менее эффективен, даже в серверных версиях и не может быть рекомендован для широкого применения.
Установка из предварительно собранного файла
Для конфигурации Nginx задействуется директория /etc/nginx/. При дальнейшей работе с сервером важны файл nginx.conf и папка sites-available.
Основные настройки можно в файле nginx.conf. Благодаря этому файлу, все параметры можно настроить по своему усмотрению. Работать можно и с настройками по умолчанию.
Важные элементы конфигурации
Сервер может обслуживать множество сайтов. Файлы, которые определяют какие именно, находятся в директории /etc/nginx/sites-available.
Чтобы Nginx работал с сайтами, их необходимо слинковать с /etc/nginx/sites-enabled.
Использования метода линкования позволяет быстро запускать сайты, не удаляя никакие файлы после их использования. Помимо этого, можно просто скопировать файлы прямо в первую директорию.
Символьная ссылка — это путь к файлу. Общий синтаксис для неё выглядит так:
Примеры ссылок для каталога и файла:
Директория sites-available содержит конфигурацию виртуальных хостов. Это позволяет веб-серверу настраиваться для множества сайтов с разной конфигурацией. Сайты в этой директории не задействуются и будут обслуживаться только, если сделать символьную ссылку на папку sites-enabled.
Настройка конфигурации
Root-каталог Nginx по умолчанию находится в директории /usr/share/nginx/html. Все файлы, которые размещаются в нем, автоматически обслуживаются веб-сервером. Место определяется файлом конфигурации, который можно найти в /etc/nginx/conf.d/default.conf.
Основной конфигурационный файл сервера находится в /etc/nginx/nginx.conf. Через него изменяются любые настройки.
Запуск
Установка Nginx на CentOS
Рассмотрим практически установку Nginx на Linux, взяв за основу один из самых популярных дистрибутивов данной операционной системы – CentOS.
Заключение
Nginx представляет собой практически готовое решение для множества задач, требующих развёртывания полноценного веб-сервера или прокси. По ряду параметров Nginx превосходит своего «старшего коллегу» Apache. Главные из них — отсутствие требовательности к ресурсам и способность обрабатывать большое число соединений одновременно.
Понимание работы и принципа обработки запросов в Nginx позволяет грамотно масштабировать и балансировать нагрузку на современных сайтах, располагающих контентом разных категорий. А связка Nginx и Apache позволяет максимально расширить эффективность применения веб-сервера.
Чтобы Nginx, Apache и другой сложный «софт» работал, как швейцарские часы, разверните их на виртуальном сервере от Eternalhost! Это мощный и надёжный инструмент для самых неординарных задач в области IT.
Что такое Nginx
В этой статье мы расскажем, что такое Nginx, как он работает, какие у него плюсы и минусы.
Nginx ― это программное обеспечение с открытым исходным кодом, которое позволяет создавать веб-сервер. Также его используют как почтовый сервер или обратный прокси-сервер.
Для начала разбёрем, что такое веб-сервер. Веб-сервер — это программное обеспечение, основная задача которого — обработка входящих и исходящих запросов на различных протоколах передачи данных. Рассмотрим этот процесс на примере веб-сайтов. После того как вы ввели URL-адрес сайта в адресной строке, браузер обращается к веб-серверу путём передачи запроса по протоколу HTTP. Веб-сервер выполняет некий набор инструкций, указанный в конфигах, и возвращает по HTTP ответ, например со статическими страницами сайта или данными для редиректа. Таким образом, веб-сервер ― это связующее звено между браузером и сервером. Зачем нужен Nginx?
Nginx работает почти на всех Linux и Unix подобных системах, а также на некоторых версиях Windows.
Как работает Nginx
Есть 2 алгоритма работы― синхронный и асинхронный. При синхронном алгоритме для каждого этапа задачи выделяется отдельный поток и вся операция выполняется шаг за шагом, то есть программа не переходит к следующему шагу, пока не закончит предыдущий. Таким образом, некоторые элементы системы периодически простаивают, пока ждут, когда придёт их очередь. Отсюда два недостатка такой системы:
По такому принципу работает, например, веб-сервер Apache.
Асинхронный алгоритм решил проблемы, перечисленные выше. При асинхронном алгоритме код по-прежнему выполняет всё шаг за шагом, но при этом системе необязательно ждать завершения одного этапа, чтобы перейти к следующему. Все задачи идут в одном потоке. Программа всегда в курсе всего процесса в целом и может переходить к следующему этапу, когда предыдущий еще не завершён. По асинхронному алгоритму работает Nginx. Благодаря такому подходу работа с Nginx позволяет:
Несмотря на плюсы Nginx и его асинхронного алгоритма, есть один минус ― блокирующие операции. Бывает так, что среди параллельно выполняющихся маленьких операций есть одна, которая задерживает весь поток. Например, весь поток может ждать ответа от жёсткого диска для одного из этапов. Это похоже на очередь в кассе супермаркета. Какое-то время вся система идёт чётко. Один человек оплачивает, второй уже выкладывает товар на ленту, кассир пробивает товар, параллельно покупатель складывает пробитый товар в пакет. Вдруг на пакете с помидорами нет штрих-кода. Покупатель бежит взвешивать. Вся очередь стоит. Процесс остановлен.
Для решения этой проблемы в версии Nginx 1.7.11 был создан новый механизм ― пул потоков. Когда в процессе нужно выполнить потенциально долгую операцию, она помещается в отдельный поток, чтобы не задерживать все остальные. В нашем примере с кассой не покупатель бы побежал взвешивать помидоры, а работник супермаркета. Пока он взвешивал помидоры, кассир продолжал бы пробивать товары, а покупатель складывать их.
Подробнее о том, как произвести установку и начальное администрирование Nginx, можно узнать в статьях: