Nginx или apache что лучше
Перейти к содержимому

Nginx или apache что лучше

  • автор:

Записки bаckend-разработчика

Images

Доброго времени суток, backend/frontend/full-stack/devops/qa/.. да какая разница, добро пожаловать, мой друг!

Свой цикл статей хотелось бы начать с до неприличия банальной фразы — «Все познается в сравнении». Ведь невозможно говорить о том, что какой-либо инструмент лучший, не опробовав другой. Попробуем сравнить два самых популярных в мире веб-сервера — Apache, который обслуживает около 60 млн сайтов, и Nginx — около 40 млн (больше интересной статистики тут). Возможно, после прочтения данной статьи вы сможете определиться, что лучше подходит для вашего dev-окружения. Итак, поехали! 😉

Начнем с архитектурных и функциональных отличий.

1. Метод обработки соединений с клиентами

Издавна, Apache на каждый запрос от клиента создает отдельный процесс (или поток, зависит от выбранного mpm модуля). Выглядит это следующим образом — клиент отправляет запрос, веб-сервер создает отдельный процесс на этот запрос, отвечает клиенту и блокирует процесс до тех пор, пока клиент не закроет соединение. Это легко и просто в реализации, дебаге и мониторниге, но … Как вы могли бы догадаться, если у вас highload проект, то.. дела плохи. Процесс в любой ОС требует памяти и ресурсов, а когда процессов становиться неприлично много, обработка соединений неприлично замедляется, память кончается, CPU растет. Для мелких проектов такая реализация архитектуры обработки соединений не добавит головной боли, но для высоконагруженных проектов придется ставить очень мощное железо или искать альтернативные варианты.

Nginx состоит из master-процесса и нескольких дочерних процессов. Мастер процесс обычно один — он создает дочерние процессы (воркеры, загрузчик кеша и кеш менеджер), считывает конфигурацию и открывает порты. Воркеров обычно несколько, разработчики nginx советуют количество воркеров определять равным числу ядер машины. Эти дочерние процессы буду обслуживать все соединения с клиентами в неблокирующей манере. В nginx используется бесконечный цикл, который бежит по всем соединениями и отвечает на запросы клиентов. Когда соединение закрывается, оно удаляется из event loop. Это решение идеально подходит для проектов, которые обслуживающих 10к+ соединений одновременно. При этом, загрузка CPU и использование памяти обычно равномерны, без видимых пиков.

2. Отдаваемый контент

Apache — может генерировать как статический контент, так и динамический. С этим никаких проблем нет. Прекрасно подойдет тем, кто не хочет заморачиваться с проксированием и настройкой дополнительного инструмента для генерации динамики, ведь Apache — это готовое работающее решение.

Nginx — отдает только статику и из коробки генерировать динамический контент не умеет. Если вы используете nginx и хотите генерировать динамический контент на своем сайте, то вам придется проксировать запросы тому, кто это делать умеет (apache, php-fpm и др.). Поэтому, разработчикам придется настраивать дополнительную связку, которая усложняет архитектуру, например nginx+apache (кстати в этой связке, Apache называют бекенд сервером, а Nginx — фронтендом), nginx + phpfpm, nginx + python и др.

3. Конфигурирование

Apache полюбился разработчикам и сисадминам не в последнюю очередь из-за возможности конфигурировать обработку соединений на уровне директорий. Делается это с помощью скрытого файла .htaccess, позволяющего настраивать права доступа, авторизацию, аутентификацию, политику кеширования и др правила. Это довольно-таки удобное решение для пользователей, потому что позволяет менять конфигурацию на лету, без перезагрузки сервера и без наличия доступа к основному конфигу сервера. Но также имеется маленький минус — Apache каждый раз при обработке соединений ищет файл .htacces и считывает с него информацию, что естественно замедляет выдачу ответа клиенту (кстати, поддержку настройки конфигурирования на уровне директорий можно и отключить).

Nginx не поддерживает конфигурирование на уровне каталогов. Существует один конфигурационный файл на весь проект, который обрабатывает master. Если вы хотите обновить конфигурацию, то необходимо отправить сигнал SIGHUP мастеру, который в свою очередь перезагружает конфигурацию и плавно завершает работу воркеров.

4. Работа с модулями

Apache за долгое время существования обзавелся около 60 официальными модулями, и еще большим числом неофициальных. Модули динамически подключаются, не требуют сборки и перезагрузки веб-сервера.

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

5. Интерпретация запросов

Apache имеет возможность интерпретировать запрос как физический ресурс в файловой системе или как URI, который требует дополнительной обработки.

Nginx создан, чтобы работать и в качестве веб-сервера, и в качестве прокси-сервера. По этой причине он работает в первую очередь с URI, транслируя их при необходимости в запросы к файловой системе.

6. Работа со скриптовыми языками

В Apache есть один модуль mod_php и все хосты вынуждены работать с одной и той же версией php и одним конфигурационным файлом.

В случае с nginx, каждый виртуалхост будет выполняться в отдельном процессе и, соответственно, может использовать разные версии php (python/ruby/perl и др.). Каждый процесс может иметь свою собственную независимую конфигурацию.

Вообще, в высоконагруженных проектах удобнее держать раздельно nginx и php. По отдельности их проще мониторить, ловить баги или узкие места. «Все-в-одном» Apache+mod_php в этом плане менее удобен.

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

7. Скорость работы

Скорость работы веб-сервера обычно измеряют для 2-х случаев отдачи контента: для статики и динамики. На основе тестов производительности, Nginx примерно в 2.5 раза быстрее отдает статику, чем Apache. Это довольно-таки большое превосходство. Если вам необходимо обслуживать большое количество статического контента, Nginx — лучший выбор. Во время тестирования отдачи динамического контента, Apache и Nginx показывают примерно одинаковые результаты. С точки зрения памяти, оба сервера используют один и тот же объем ресурсов. (Подробнее о тестах скорости отдачи контента можно почитать здесь)

8. Поддержка ОС

Apache прекрасно работает на Unix-подобных операционных системах, также разработчики этого веб-сервера полностью поддерживают линейку Microsoft Windows, включая последние версии этой ОС.

Nginx также поддерживает работу на множестве Unix-подобных ОС и имеет некоторую поддержку Windows, которая не является полной. Но разве кто-то в наше время размещает веб-сервер на Windows?

9. Сообщество и поддержка

Apache на рынке с 1995 года, что очень немалый срок, обеспечивший инструменту огромное сообщество и поддержку с его стороны. Практически на все вопросы на Stack Overflow уже есть исчерпывающие ответы. Коммерческой поддержки нет.

Nginx веб-сервер более молодой, на рынке он с 2004 года, что также не помешало большому сообществу сформироваться и поддерживать друг друга. Nginx, в отличие от Apache, имеет коммерческую версию Nginx Plus, которая дополнена инструментами балансировки нагрузки, мониторинга, потоковой передачи медиа и др.

10. Документация и обучение

И у Apache и у Nginx присутствует доступная официальная документация.

Nginx предлагает платное обучение, включающее в себя онлайн курсы, практические занятия и экзамен. По окончании курса все участники получают сертификаты. Например, сдать экзамен по основам nginx и получить официальный сертификат обойдется в 49$ (подробнее здесь).

От себя хотелось бы отметить, что оба решения очень стабильны, безопасны и поддерживаемы. Выбирайте то, что подходит именно вам. Пробуйте, экспериментируйте, ошибайтесь и снова пробуйте. Всем добра и будьте здоровы!

Что лучше использовать, Apache или Nginx?

В этой статье мы с вами сравним два веб-сервера, выясним их переимущества и недостатки, назовем их основные различия. А также объясним, почему мы остановили свой выбор именно на Nginx для хостинг-провайдера Zahid-Host.

Какая разница между Apache и Nginx?

Чтобы ответить на этот вопрос, нужно разобрать их по отдельности.

Apache – создан в 1995 году, уже в 1996 году он был самым популярным в мире. Его главные преимущества — это сильная документация и интеграция со сторонним хостом, большая гибкость, надежность, мощность и широкая распространённость. Одним из главных недостатков Apache считается отсутствие графического интерфейса для настройки, поэтому конфигурационные файлы приходится редактировать вручную.

Nginx – выпущен в 2004 году. Он создан для поддержания 10 000 одновременных соединений, с чем он справляется. К плюсам Nginx можно отнести: легкое размещение на “железе” с минимальными характеристиками и работоспособность на нем, простота, скорость и отказоустойчивость. Большой минус Nginx — это отсутствие встроенного PHP. Это можно исправить с помощью подключения PHP через специальный интерфейс FastCGI (отдельный клиент-серверный протокол).

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

Почему стоит использовать Nginx ?

Так как наш хостинг предназначен для поддержания профессиональных сайтов, нам важна скорость загрузки e-commerce сайта и его устойчивость под сильной нагрузкой. Nginx создает один поток и сразу же обрабатывает его, не создавая лишние процессы. Потому нагрузки на сервер не настолько велика. А чем меньше нагрузка на само » железо » , тем быстрее и стабильнее работает система в целом.

Apache и nginx

Nginx – это дополнительный высокопроизводительный веб-сервер, который обычно используется как обратный прокси и позволяет улучшить работу основного веб-сервера (Apache), отвечающего за хостинг клиентских сайтов. Этот веб-сервер был разработан специально для передачи больших объемов статического контента (изображений, видео, css, xml и так далее). Nginx намного эффективнее справляется с большим количеством одновременных подключений, чем Apache. А также потребляет гораздо меньше памяти в расчете на одно подключение.

Для наиболее оптимального использования nginx Plesk настраивает его как обратный прокси-сервер между Интернетом и Apache (см. схему ниже). Это означает, что nginx работает как внешний веб-сервер, который принимает все входящие запросы от посетителей сайтов. Эти запросы отправляются Apache, который в свою очередь разделяет их в зависимости от того, какой тип контента запрашивается – статический или динамический. Если запрашивается статический файл (jpg, css, html и т.д.), Apache пропускает запрос через все имеющиеся обработчики (применяет конфигурацию .htaccess , перезаписывает URL и т.д.) и возвращает nginx ответ, содержащий только расположение запрошенного файла в файловой системе. Nginx находит этот файл и отправляет его клиенту. Если запрашивается динамический файл (например, скрипт PHP), Apache исполняет этот файл и отправляет ответ nginx, который доставляет его клиенту.

image 70996

Такая комбинация из nginx и Apache обеспечивает следующие преимущества:

  • Увеличивается максимальное количество одновременных подключений к одному сайту.
  • Сокращается потребление процессорного времени и памяти на сервере. Этот эффект будет наиболее ощутим для сайтов с большим объемом статического контента (фотогалереи, видеохостинги и так далее).
  • Оптимизируется обслуживание посетителей с низкой скоростью соединения (GPRS, EDGE, 3G и т.д.). Например, допустим, что клиент со скоростью подключения 10 KБ/с запрашивает некий сценарий PHP, который генерирует ответ размером 100 KБ. Если на сервере не установлен nginx, то этот ответ доставляется веб-сервером Apache. В течение всех 10 секунд, необходимых для доставки ответа, Apache и PHP продолжают потреблять полный объем системных ресурсов для поддержания этого открытого подключения. Если же nginx установлен, Apache перенаправляет этот ответ ему (соединение между nginx и Apache очень быстрое, так как оба находятся на одном сервере) и высвобождает системные ресурсы. Благодаря тому, что nginx потребляет меньше памяти, общая нагрузка на систему сокращается. Если у вас много таких медленных подключений, использование nginx позволит вам значительно повысить производительность сайтов.

Технические подробности того, как Plesk обрабатывает HTTP-запросы с помощью nginx, приведены далее в этом разделе. Информацию о том, как включить поддержку nginx в Plesk, смотрите в разделе Установка nginx . Если вы не хотите использовать веб-сервер nginx, вы можете отключить его, как описано в разделе Отключение nginx . Если вы хотите, чтобы nginx обслуживал все HTTP-запросы к веб-контенту, смотрите Изменение настроек веб-сервера Apache.

Как обрабатываются HTTP-запросы в Plesk с nginx

Чтобы обеспечить интеграцию между nginx и Apache, Plesk использует два дополнительных модуля Apache:

  • mod_aclr2. Этот модуль устанавливает обработчик, который запускается после обработчиков всех остальных модулей Apache (mod_rewrite; модулей, связанных с .htaccess ; mod_php и т.д.). Таким образом, в случае запроса динамического контента модуль mod_aclr2 никогда его не получит, так как этот запрос будет выполнен вышестоящими обработчиками соответствующих модулей Apache (mod_php, mod_perl, mod_cgi и т.д.). Единственным исключением являются запросы SSI: как только они доходят до модуля mod_aclr2, он перенаправляет их соответствующим обработчикам. Если запрашивается статический файл, mod_aclr2 находит точное расположение файла в файловой системе и сообщает его nginx.
  • mod_rpaf или mod_remoteip С точки зрения Apache все клиенты имеют один и тот же IP-адрес – адрес сервера nginx (см. схему выше). Это создает проблемы для сайтов и веб-приложений, использующих IP-адреса клиентов для идентификации, сбора статистики и так далее. Модуль mod_rpaf (в Apache 2.2) или mod_remoteip (в Apache 2.4) решает эту проблему, заменяя IP-адрес сервера nginx на IP-адреса клиентов во всех запросах. Если подробнее, то этот модуль использует специальный заголовок X-Forwarded-For, в который nginx помещает IP-адрес клиента.

Давайте более подробно рассмотрим, как Plesk обрабатывает запросы статического и динамического контента с помощью этих модулей.

Обработка HTTP-запроса статического файла происходит следующим образом (см. схему):

  1. Клиент отправляет запрос веб-серверу.
  2. Nginx добавляет в этот запрос заголовки X-Accel-Internal (используется модулем mod_aclr2) и X-Forwarded-For (содержит IP-адрес клиента) и отправляет его Apache.
  3. Apache получает запрос и пропускает его через зарегистрированные обработчики (применяет конфигурацию .htaccess , перезаписывает URL и т.д.). На этом этапе модуль mod_rpaf заменяет IP-адрес сервера nginx в переменной Apache REMOTE_ADDR на адрес клиента из заголовка X-Forwarded-For.
  4. После прохождения через все зарегистрированные обработчики запрос попадает в модуль mod_aclr2. Обработчик проверяет наличие заголовка X-Accel-Internal. Если он есть, модуль отправляет серверу nginx ответ с заголовком X-Accel-Redirect и пустым содержимым. Этот заголовок содержит точное расположение файла, определенное модулем mod_aclr2.
  5. Получив ответ, сервер nginx находит соответствующий файл и передает его клиенту.

На расположенной ниже схеме приведен пример обработки запроса файла GIF размером 2 КБ.

image 71008

В случае с динамическим контентом шаги с первого по третий будут такими же. Затем запрос передается обработчику соответствующего модуля Apache (mod_php, mod_perl, mod_cgi и т.д.). Запрос никогда не доходит до модуля mod_aclr2 (за исключением запросов SSI). Обработчик формирует ответ и отправляет его nginx, который в свою очередь доставляет его клиенту. На следующей схеме приведен пример обработки запроса файла PHP.

image 71009

Установка nginx

В случае установки Plesk с нуля сервер nginx включен по умолчанию. В случае обновления с более ранней версии вы всегда можете добавить компонент nginx на странице Инструменты и настройки > Обновления > Установить/удалить компоненты. После установки компонента запустите службу Обратный прокси-сервер (nginx) на странице Инструменты и настройки > Управление службами.

Номер установленной у вас версии nginx можно посмотреть на странице Инструменты и настройки > Серверные компоненты.

image 74959

Выключение nginx

Чтобы вернуться к конфигурации с одним веб-сервером (Apache), остановите службу Обратный прокси-сервер (nginx) на странице Инструменты и настройки > Управление службами.

image 74960

Чтобы снова включить nginx, запустите службу Обратный прокси-сервер (nginx).

Примечание: Запуская и останавливая службу Обратный прокси-сервер (nginx), вы не только включаете и отключаете nginx, но и меняете конфигурацию веб-сервера (при одной внешним веб-сервером является комбинация из nginx и Apache, при другой ― только Apache). Перезапуск работает так же, как со всеми остальными службами: служба nginx просто перезапускается.

Apache vs Nginx: выбираем оптимальный веб-сервер

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

История создания

Apache был создан в далеком 1995 году, а уже через год стал самым популярным веб-сервером в мире. Основной идеей разработчика Роберта Маккула было создать гибкое и мощное ПО, которое хорошо интегрируется с другим софтом. Так и вышло – большинство сисдаминов выбирают именно динамичный Аpache, который можно дополнять функциональными модулями.

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

Принцип работы

Аpache в ответ на каждый пользовательский запрос создает отдельный процесс или поток. Технология очень проста в реализации, но абсолютно не подходит для многозадачных проектов. Любой процесс «съедает» память и ресурсы системы, и ладно, если процессов мало. А если их сто, тысяча, миллион? Все-таки Аpache создан для не очень больших проектов с низким уровнем загруженности.

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

Выдача контента

Аpache генерирует как статический, так и динамический контент, поэтому его выбирают пользователи, которые не хотят возиться с проксированием и настраивать дополнительные инструменты для работы с динамикой.

Nginx выдает только статический контент, а вот динамику генерировать не умеет. Но, как вариант, его можно использовать в связке с Apache, PHP-PFM и любым другим web-приложением такими как Python (Django), Ruby on Rails, nodejs и другими.

Возможности конфигурирования

Аpache дает возможность конфигурировать обработку запросов на уровне каталогов при помощи скрытого файла htaccess. В нем можно настраивать авторизацию и аутентификацию, кеширование и права доступа пользователей. При этом менять конфигурацию можно буквально на лету, не перезагружая сервер и не залезая в основные настройки.

В Nginx такой функции нет. На весь проект имеется только один конфигурационный файл, который обрабатывает мастер. Чтобы обновить конфигурацию, нужно отправить сигнал мастеру и перезагрузить сервер.

Наличие модулей

На данный момент у Аpache имеется 60 официальных модулей и еще больше любительских. Модули не требуют сборки, их можно сразу загружать в ленту.

У Nginx существует 130 официальных модулей, но все они требуют сборки. Такой подход более сложный, но зато и более безопасный.

Поддержка ОС

Аpache поддерживает все Unix-подобные ОС и всю линейку Windows, включая последние обновления.

Nginx поддерживает большинство Unix-подобных ОС и частично Windows.

Немного статистики

  • Аpache обслуживает около 69 миллионов веб-сайтов, Nginx – почти 44 миллиона.
  • Аpache идеально подходит для использования в 229 категориях веб-сайтов, включая «бизнес и промышленность», «искусство и развлечения», «торговля», «интернет и телекоммуникации». Nginx лидирует в 9 категориях, в том числе «человек и общество», «религия и духовность», «юмор», «форумы и чаты».
  • Аpache – основной веб-сервер в 207 странах мира, включая США, Японию, Германию и Францию. Nginx предпочитают в 10 странах, в том числе Украине, Китае, Индонезии и России.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *