Что лучше Nginx или Apache 2016
Nginx и Apache - это два самых популярных веб-сервера с открытым исходным кодом, которые используются для размещения сайтов по всему миру. Вместе их доля составляет более 50% всего трафика в интернете. Обе программы предлагают все необходимые возможности, способны нормально выдерживать большие рабочие нагрузки и интегрироваться с другим программным обеспечением чтобы обеспечить полноценный веб-стек.
Веб-сервера Apache и Nginx имеют очень много схожих качеств, но их нельзя рассматривать как взаимозаменяемые. Каждая программа имеет свои особенности, и поэтому лучше всего подходит для определенных ситуаций. В этой статье мы попытаемся выяснить что лучше Nginx или Apache для той или иной области, а также попробуем понять основные отличия программ.
Общая информация
Прежде чем мы перейдем к более детальному сравнению Apache vs Nginx давайте рассмотрим общие характеристики этих веб-серверов.
Apache
Веб-сервер Apache был разработан Робертом МакКулом в 1995 году под руководством Apache Software Foundation. С 1999 и по сей день Apache - это проект Apache Software, и сейчас это одна из самых популярных их программ.
Начиная с 1996 года Apache был самым популярным веб-сервером на просторах интернета. Из-за такой популярности веб-сервер имеет много документации и комплексную поддержку со стороны других компаний.
Администраторы часто выбирают Apache из-за его гибкости, мощности и поддержки интеграции со многими продуктами. Его можно расширять через динамически загружаемые модули, также это позволяет поддерживать большое количество интерпретируемых языков программирования без подключения специального ПО.
Nginx
В 2002 году Игорь Сусоев начал работу над веб-сервером Nginx, он поставил перед собой цель решить проблему десяти тысяч подключений, которой были подвержены все известные на то время веб-серверы. Дело в том, что ни один из существующих веб-серверов, не позволял обрабатывать 10 тысяч запросов одновременно. Первый публичный релиз состоялся в 2004 году и цель была достигнута, благодаря реализации архитектуры, основанной на асинхронных событиях.
Из-за своей легковесности, низкого потребления ресурсов и способности масштабироваться на различном аппаратном обеспечении почти сразу же Nginx завоевал огромную популярность. Nginx показал себя очень хорошо при обслуживании статического контента, а динамические запросы передавались другим программам.
Nginx часто выбирается администраторами для эффективного использования ресурсов и работы под большой нагрузкой. Этот веб-сервер сочетает в себе основные возможности веб-сервера и функции прокси.
Отличия архитектуры
Самое большое отличие Apache и Nginx в том, как они обрабатывают соединения и трафик. Это влияет на то как они справляются с различной нагрузкой.
Apache
Apache работает в мультипроцессорном режиме. Программа имеет несколько модулей, которые управляют обработкой соединений. Эта архитектура позволяет администраторам очень просто управлять подключениями.
mpm_prefork - этот модуль создает отдельный процесс с одним потоком для обработки каждого запроса. Каждый дочерний процесс может обрабатывать только одно соединение одновременно. Пока количество запросов будет меньше чем количество запущенных MPM, веб-сервер работает очень быстро. Но как только запросы превосходят количество процессов, производительность сильно снижается. Поэтому во многих случаях Apache - это не очень хороший выбор.
Каждый процесс потребляет оперативную память, поэтому MPM будет сложно использовать на слабом оборудовании. Но он по-прежнему может быть отличным выбором при работе с определенными компонентами. Например, php не поддерживает потоки, поэтому это единственный способ безопасной работы с mod_php.
mpm_worker - этот модуль создает процессы, которые управляют несколькими потоками. Каждый из потоков может обрабатывать одно соединение. Потоки гораздо эффективнее чем процессы, а это значит, что mpm_worker лучше, чем mpm-prefork. Потоков больше чем процессов и новые соединения могут взять любой из свободных потоков, вместо того чтобы ждать освобождения процесса.
mpm_event - этот модуль похож на mpm-worker, только оптимизирован для работы с keep-alive соединениями. При обработке в mpm-worker соединение будет держать поток занятым независимо от того активно оно или нет. mpm_event позволяет отдавать отдельные потоки для keep-alive соединений, так чтобы они не мешали работать другим потокам.
Как видите, Apache предоставляет очень гибкую архитектуру для выбора различных алгоритмов обработки соединений. Такой выбор появился с развитием веб-сервера и растущей потребности в парализации.
Nginx
Nginx появился на арене после того, как всплыли все проблемы параллелизма Apahce. Nginx был разработан с нуля уже учитывая эти ошибки, он использует асинхронный код без блокировок, а алгоритм обработки соединений основан на событиях.
Nginx создает процессы-работники, каждый из которых может обрабатывать одновременно до тысячи соединений. Это достигается путем реализации быстрого цикла, который постоянно проверяет и обрабатывает новые события. Это решение позволяет каждому процессу запускать обработку соединение, сразу, как только было получено событие.
Каждое, обрабатываемое соединение помещается в цикл обработки событий, где они находятся до завершения обработки. Все события обрабатываются асинхронно, поэтому работа веб-сервера не блокируется. Когда соединение будет закрыто, оно удалиться из цикла. Этот способ работы позволяет обрабатывать очень много подключений с минимальной затратой ресурсов.
Генерация контента
С точки зрения использования в реальных сценариях наиболее часто выполняется сравнение Nginx или Apache при обработке динамического и статического контента
Apache
Apache может обрабатывать статическое содержимое с помощью процессов MPM. Динамическое содержимое обрабатывается путем встраивания интерпретатора нужного языка в каждый из процессов. Это позволяет обрабатывать динамическое содержимое внутри самого веб-сервера. А это, в свою очередь, означает, что настройка обработки динамики проще. Если требования к содержимому изменятся, то модули можно очень просто заменить.
Nginx
Nginx не обрабатывает динамическое содержимое. Для обработки PHP или других динамических запросов нужно использовать внешний интерпретатор и ждать пока он вернет результат обработки.
Это означает, что нужно настроить соединение между Nginx и одним из интерпретаторов. Nginx поддерживает такие протоколы FastCGI, SCGI, uWSGI, memcache. Это может немного усложнить ситуацию, особенно при попытке предвидеть количество соединений.
Но поскольку динамический интерпретатор не включен в основной процесс, он будет замедлять работу сервера только для динамического контента. Статическое содержимое может быть выдано напрямую и очень быстро. Apache тоже может так функционировать, но тогда он теряет свои преимущества.
Отличия настройки
Для администраторов одним из самых значительных отличий между Apache vs Nginx будет способ настройки и размещение конфигурационных файлов.
Apache
Apache настраивается через главный конфигурационный файл, но поддерживает опцию, которая позволяет включить возможность настройки в каждом отдельном каталоге с помощью скрытых файлов .htaccess.
Эти файлы находятся внутри самих каталогов с веб-контентом и поэтому их могут использовать не только администраторы системы, но и владельцы сайтов. Apache проверяет каждый компонент пути и ищет все .htaccess файлы, затем применяет директивы, найденные в них. Это дает очень эффективную децентрализованную конфигурацию. Она часто используется для перенаправлений, модификации URL и ограничения доступа.
Файлы .htaccess имеют несколько преимуществ. Они выполняются каждый раз, когда будут обнаружены, а значит для их обновления не нужно перезагружать сервер. Также с ними могут работать непривилегированные пользователи.
Nginx
Nginx не поддерживает интерпретацию .htaccess файлов или любой другой механизм настройки вне основного конфигурационного файла. Такой вариант менее гибкий, но у него есть свои преимущества.
Работа без .htaccess выполняется намного быстрее, потому что не нужно ничего сканировать, проверять каждый каталог, читать и интерпретировать несколько файлов для каждого запроса. Nginx будет обслуживать запросы быстрее. Второе преимущество - это безопасность, веб-сервер будут контролировать только привилегированные пользователи, а значит меньше вероятность допустить ошибку.
Отличия определения путей
Веб-сервера по-разному интерпретируют запросы к документам, это тоже важное отличие Apache и Nginx.
Apache
Apache интерпретирует запросы как физические ресурсы в файловой системе или в качестве местоположения документа. Для файлов используются теги и , а для более абстрактного местоположения - .
Изначально Apache разрабатывался чтобы интерпретировать любой запрос как файл. Веб-сервер извлекает корень документа и добавляет часть запроса после имя хоста и порта, затем пытается найти такой файл.
Когда запрос не соответствует файлу есть несколько альтернатив, например, директива Alias может быть использована для указания альтернативного местоположения. Директива позволяет превратить любой URL адрес в адрес файловой системы с помощью регулярных выражений. Но все же Apache больше рассчитан на работу с файлами.
Nginx
Nginx был создан как одновременно веб-сервер и прокси сервер. Из-за архитектуры, необходимой для этих двух решений он работает в первую очередь с URL, переходя в файловую систему только когда это необходимо. Это можно увидеть, когда вы будете работать с файлом конфигурации Nginx, здесь преобразование в файл происходит только в самом конце обработки.
Основные блоки - это server и location, первый указывает какой хост запрашивается, а второй проверяет соответствие частей URL по регулярному выражению.
Для статических ресурсов все запросы в конечном итоге должны быть преобразованы в ресурс файловой системы. Nginx выбирает блок Server и Location, который будет обрабатывать запрос, а затем дает ему выполнить нужные преобразования.
Такой подход позволяет более просто функционировать в роли веб-сервера и прокси одновременно. Вам нужно только указать как реагировать на определенные типы запросов.
Модули
Оба севера Nginx и Apache поддерживают расширение возможностей через модули, но реализация очень сильно отличается.
Apache
Система модулей Apache позволяет динамически загружать или выгружать модули чтобы удовлетворить ваши потребности во время запуска сервера. Ядро Apache всегда включено, а модули могут быть включены или отключены.
Эта функция очень часто используется, есть огромное количество модулей. Они могут быть применены для изменения некоторых функций веб-сервера, например, модуль mod-php позволяет встроить php интерпретатор в каждый поток. Модули могут добавлять аутентификацию, кэширование, ограничение скорости и даже шифрование.
Nginx
У Nginx тоже есть модульная система, но она очень сильно отличается от Apache. Здесь модули не загружаются динамически, они должны быть выбраны и скомпилированы в состав основной программы.
Для многих пользователей это делает Nginx не таким гибким. Пакеты, распространяемые в официальных репозиториях, содержат только самые часто используемые модули, но если вам нужно что-то экзотическое, придется перекомпилировать программу.
Но здесь модули тоже очень полезны, они позволяют сильно расширить функциональность программы. Они более безопасны, так как произвольные компоненты не могут быть включены. Модули Nginx позволяет делать то же что и в Apache: проксирование, ограничение скорости, аутентификацию, шифрование, потоковая передача и многое другое.
Поддержка и документация
На процесс обучения очень сильно влияет наличие хорошей документации и поддержки других пользователей.
Apache
Поскольку Apache имеет более долгую историю развития, для него существует большое количество документации, как для основного сервера, так и для сторонних решений и сценариев. Также много инструментов включают в себя инструменты для интеграции в среду Apache. Также больше шансов, что администраторы уже имели опыт работы с Apache.
Nginx
Nginx тоже имеет отличную документацию и много пользователей используют его из-за улучшенной производительности. Но в некоторых областях еще не все так хорошо.
Но явным плюсом есть то, что изначально вся документация писалась на русском языке. Поэтому вы можете ознакомиться с полной документацией, даже если не знаете английский. Но вот что касается поддержки сторонними приложениями, то тут все не так хорошо. Если разработчикам приходится выбирать Nginx или Apache, то они выбирают Apache.
Использование Nginx и Apache
После рассмотрения всех преимуществ и недостатков вы можете применять Nginx и Apache вместе чтобы использовать сильные стороны обоих сторон. Традиционная конфигурация - размещение Nginx перед Apache, в качестве обратного прокси сервера. Nginx обрабатывает все запросы от клиентов и очень быстро отдает статические файлы, не загружая ресурсы.
Для динамического содержимого, например, PHP, Nginx выступает в качестве прокси сервера и передает запрос к Apache. Затем результат возвращается клиенту.
Эта конфигурация отлично подходит для мноих людей, так как она позволяет Nginx функционировать в качестве сортировочной службы. Nginx будет защищать Apache от перегрузки. Также, по мере необходимости можно добавлять несколько внутренних серверов, и тогда Nginx будет выступать в качестве пула.
Выводы
Как вы можете видеть, сложно определить что лучше Nginx или Apache. Оба веб-сервера мощны, гибки и полнофункциональны. Вам предстоит выбрать какой веб-сервер лучше для вас, а это зависит от ваших требований и оборудования.
Между проектами существуют огромные отличия, которые сильно влияют на производительность и возможности. Не существует универсального решения и вам предстоит сделать выбор. Мы выбрали Nginx. А какой веб-сервер лучше по-вашему? Напишите вы комментариях!
Источник:
Комментариев 0