14 марта 2023 Время чтения: 5 минут

Лев Матюшкин,

разработчик ПО

Веб-серверы Apache и Nginx

ispmanager

Ни один сайт не обходится без веб-сервера. Так называется программа, которая стоит на физическом сервере (удаленном компьютере) и принимает запросы от клиента, а в ответ отправляет HTML-страницу, изображение, файл или какой-нибудь медиапоток: музыку, фильм, стрим. Клиентом может быть веб-браузер или любая другая программа, которая хочет пообщаться с нашим веб-сервером.

Взаимодействие клиента и сервера

Итак, клиент отправляет запрос, веб-сервер его изучает, и в соответствии с тем, как его настроили, делегирует запрос одному из внутренних приложений. Приложение проводит необходимые действия и возвращает веб-серверу результат, тот отдает его клиенту.

Упрощенное представление процесса обработки соединения на примере браузера и веб-сервера для получения HTML-страницы. Веб-сервер запускает PHP процесс для динамической генерации страницы с захватом информации из базы данных
Упрощенное представление процесса обработки соединения на примере браузера и веб-сервера для получения HTML-страницы. Веб-сервер запускает PHP процесс для динамической генерации страницы с захватом информации из базы данных

В общем, веб-сервер — это классический посредник, который общается с клиентами стандартным образом так, что тем не нужно ничего знать о внутреннем устройстве сайта. Если запрос клиента выполнить нельзя, веб-сервер тоже должен об этом сообщить, чтобы клиент понимал, в чем проблема и по возможности исправил ситуацию. Например, авторизовался на сайте, чтобы подтвердить имеющиеся права доступа, или скорректировал опечатку в URL, чтобы не получать от сервера ошибку 404.

Веб-серверы

Клиенты могут быть самыми разными, а вот в качестве таких посредников-программ, как мы описали выше, обычно используют один из двух веб-серверов: Apache или Nginx. Обе программы имеют открытый исходный код, подробную документацию и поддерживаются крупными сообществами, но появились в разные периоды времен с разными требованиями к веб-серверам. Сейчас поясним.

Apache

Apache появился в 1990-х годах, как решение задачи доставки веб-контента в быстро растущем интернете. Архитектура Apache состоит из ядра и связанных с ним модулей: ядро принимает соединения, а модули соответствуют функциям, выполняемым по запросу. За счет модулей веб-сервер умеет не только обрабатывать HTTP-соединения, но также выполняет дополнительные функции.

  • Балансировка нагрузки — разделение трафика между серверами внутренней сети, чтобы распределить задачи и обеспечить отказоустойчивость системы. Примерами таких модулей в Apache являются mod_status и mod_proxy_balancer;;
  • Кэширование информации — хранение ответов заданное время, чтобы при повторном обращении сократить количество запросов на бэкенд. Примером такого модуля в Apache является pagespeed, он используется для сжатия и кэширования данных;
  • Поддержка разных протоколов и видов запросов: не только HTTP, но также протокол передачи файлов FTP (модуль mod_ftp), протоколы электронной почты и другие;
  • Поддержка разных операционных систем и языков программирования.

Apache – это надежный веб-сервер с относительно простой настройкой для небольших веб-приложений, но по мере увеличения числа запросов централизованная архитектура Apache приводит к замедлению работы веб-сервера.

Nginx

Nginx (произносится энджи́нкс или э́нжин-и́кс) появился в середине 2000-х как решение российских разработчиков, которое устраняло бы ограничения Apache за счет применения другого подхода к архитектуре веб-сервера.

Apache по умолчанию создаёт для одного входящего соединения один программный поток и не приступает к следующему соединению, пока не закончил обслуживать предыдущее. Nginx запускает в параллели несколько процессов, каждый из которых может обрабатывать тысячи HTTP-соединений.

Асинхронная архитектура Nginx делает нагрузку более предсказуемой с точки зрения использования ресурсов и задержек, и в результате сам сервер легко масштабируется на самом простом «железе». По всем тестам производительности Nginx либо сопоставим, либо работает быстрее и потребляет меньше памяти, чем Apache. Nginx также чаще выбирают для сайтов с поддержкой современных веб-технологий: HTTP/2 и IPv6.

Apache vs Nginx

Главное различие между двумя веб-серверами состоит в механике обслуживания множества соединений. Apache реализует несколько решений с помощью трёх Multi-Processing модулей (MPM). Разработчик сам решает, какой модуль использовать в зависимости от задачи:

  • mpm_prefork запускает под каждый запрос один процесс, а в нем единственный поток обработки, так что в один момент времени процесс обслуживает только одно соединение;
  • mpm_worker запускает в каждом процессе несколько потоков обработки данных. Переключение между потоками требует меньше программных ресурсов и, чем между процессами. Освободившийся поток сразу берётся за новое соединение;
  • mpm_event работает аналогично mpm_worker, но оптимизирован под keep-alive соединения. В рамках такого типа соединений отправляется множество пар запрос-ответ без открытия новых соединений. Модуль выделяет разные потоки под разные типы соединений, так что сервер не увязает в обработке keep-alive.

Если вы незнакомы с понятиями процессов и потоков, описание MPM-модулей Apache окажется трудным для восприятия. Это ещё одна причина, почему начинающие разработчики выбирают Nginx. Ведь этот веб-сервер исходно спроектирован на базе асинхронных алгоритмов, и даже без использования модулей Nginx отлично справляется с большим количеством соединений, так что разработчику не приходится предпринимать дополнительных действий.

Для настройки Nginx достаточно создать один конфигурационный файл nginx.conf, а для Apache нужно редактировать файлы настроек на нескольких уровнях операционной системы, в том числе специальных файлов .htaccess, регулирующих права на уровне каталога.

Может показаться, что Apache во всём проигрывает Nginx, но с той задачей, для которой он разрабатывался (доставка веб-контента), он справляется хорошо, и к тому же поддерживает многие языки программирования. Поэтому два веб-сервера часто используют в связке.

Apache + Nginx

Важным фактором распространения Nginx стало то, что он может выступать в роли обратного прокси-сервера — транслировать запросы от клиентов из внешней сети на серверы внутренней сети, в том числе веб-серверы Apache. Это распространенный шаблон в системном администрировании: Nginx берет на себя всю рутинную работу по кэшированию статических файлов и распределению запросов, Apache или другой веб-сервер запускает процессы для возврата динамически генерируемого контента веб-страниц.

Пример стандартной архитектуры сервера с веб-приложением: клиент взаимодействует с прокси-сервером (Nginx) и тот может выдавать статические файлы (например, изображения или pdf-файлы), а для динамического контента опрашивать указанные в настройках веб-серверы на базе Apache
Пример стандартной архитектуры сервера с веб-приложением: клиент взаимодействует с прокси-сервером (Nginx) и тот может выдавать статические файлы (например, изображения или pdf-файлы), а для динамического контента опрашивать указанные в настройках веб-серверы на базе Apache

Пара альтернатив

Apache и Nginx вместе обслуживают не менее половины всех сайтов, но и у них есть альтернативные решения. Третью и четвертую строчку в рейтинге самых популярных веб-серверов обычно занимают IIS и LiteSpeed.

  • IIS — веб-сервер, разработанный Microsoft для своих операционных систем. По умолчанию он выключен в Windows, но его можно активировать специально. IIS используется для проектов на базе Windows Server и веб-приложений с использованием технологии ASP.NET.
  • LiteSpeed является современной альтернативой Apache и совместим с его файлами настроек, но дает более высокую производительность, задействует меньше ресурсов и умеет эффективно кэшировать данные. Сервер является проприетарным, но у него есть и open-source версия под названием OpenLiteSpeed.

Как попробовать работу с веб-сервером

Самый простой способ попробовать работу с веб-сервером — панель ispmanager. В панели можно установить любой из популярных веб-серверов с открытым исходным кодом: Apache, Nginx или OpenLiteSpeed. Далее запустить на их базе приложение и проверить результат работы в реальном времени.