Вопрос или проблема
Я искал и читал несколько недавних постов о “Nginx против Apache”.
Почему-то все они упоминают, что Nginx в несколько раз быстрее Apache (в режиме MPM event) при обслуживании статического контента, но никто из них не объясняет, почему. Например, этот пост с тестом https://www.speedemy.com/apache-vs-nginx-2015/.
Недавно я прочитал несколько официальных вводных материалов о Apache и Nginx. Меня в основном интересует внутреннее устройство.
Итак, мне интересно, есть ли разница в скорости обслуживания статического контента, связанная с какими-либо внутренними различиями в конструкции?
Другими словами, есть ли простая причина, почему Nginx в несколько раз быстрее Apache в обслуживании статического контента, поскольку у Apache сейчас тоже есть событийный режим (MPM event)?
Я не ищу сложный ответ. Я просто хочу знать, есть ли какие-то специальные механизмы/правила в Apache, из-за которых Apache работает медленнее в этой области.
Простая причина обычно заключается в том, что событийный MPM все еще более блокирующий, чем событийный цикл Nginx.
Стоит привести слова Эрика Ковенера из Apache по этому поводу
в событии:
- обработчики (плагины, отвечающие за генерацию ответа) синхронны — если они выполняют вычисления или ввод-вывод, они заблокируют поток
- ядро должно использовать блокировки между потоками для защиты ключевых структур данных, поскольку оно многопоточное, чтобы поддерживать так много этих синхронных запросов
Вот почему при очень высоких объемах сервера, такие как Nginx (или Apache Traffic Server или любой современный коммерческий/высокопроизводительный прокси), как правило, выступают вперед.
Конечно, сегодня растущий разрыв между этими двумя также имеет социальную причину: работая по модели freemium, Nginx может быстро внедрять новые технологии (например, kTLS, pcre.jit), тогда как Apache httpd, будучи проектом сообщества, обычно отстает.
Nginx использует асинхронную, событийную архитектурную модель, позволяющую ему обрабатывать тысячи одновременно открытых соединений с минимальным потреблением ресурсов. Это особенно эффективно для обслуживания статического контента, где нет необходимости в отдельных процессах или потоках для каждого соединения.
В основной документации есть больше деталей о контексте событий и соединений по рабочим процессам.
Этот артикул также хорошо объясняет этот способ работы.
Для меня это определяющий фактор.
Ответ или решение
Основные причины высокой скорости Nginx по сравнению с Apache при обслуживании статического контента
Введение
Непрерывно повышающаяся нагрузка на веб-серверы и требования к быстродействию делают выбор между Nginx и Apache ключевым вопросом для многих администраторов и разработчиков. Многие пользователи сообщают о том, что Nginx фактически превышает Apache по скорости обслуживания статического контента. Ниже рассмотрим, почему так происходит.
Архитектурные различия
-
Асинхронная, событийная модель Nginx
Nginx использует асинхронную модель с событийным циклом. Это позволяет серверу обрабатывать тысячи одновременных соединений, используя минимальные ресурсы. Каждый работник Nginx может обрабатывать много соединений одновременно, не создавая нового потока или процесса для каждого запроса. Это особенно эффективно для статического контента, где сложные вычисления или блокирующий ввод-вывод не требуются. -
Модель многопоточности Apache
Apache (в режиме MPM event) может обрабатывать множественные запросы, но его архитектура предполагает блокирующие операции. По сути, каждый обработчик запроса (плагины, отвечающие за генерацию ответа) является синхронным. Если обработчик выполняет операции ввода-вывода или требует вычислительных ресурсов, он блокирует поток, который в этот момент не может обрабатывать другие запросы. Это приводит к потере производительности при высоких нагрузках. -
Блокировки и консистентность данных
Apache, как сервер с многопоточным подходом, должен использовать блокировки для защиты ключевых структур данных, чтобы обеспечить согласованность при доступе из разных потоков. Это добавляет накладные расходы, снижающие скорость обработки запросов, особенно в условиях интенсивной работы с большим количеством соединений.
Социальные и технологические аспекты
Современная инфраструктура и развитие технологий также влияют на разницу в производительности. Nginx, работающий по модели freemium, способен быстрее включать новейшие технологии (например, kTLS, pcre.jit) в свою кодовую базу и обновлять функционал. Apache, как проект с открытым исходным кодом, развивается медленнее и может не успевать за последними трендами в производительности и устойчивости.
Заключение
Таким образом, ключевыми факторами, способствующими высокой скорости Nginx по сравнению с Apache при обслуживании статического контента, являются его асинхронная и событийная архитектура, в отличие от блокирующего подхода Apache. Эти внутренние механизмы и правила делают Nginx более эффективным в условиях высокой нагрузки, что подтверждается многочисленными тестами и отзывами. Выбор сервера зависит от специфики задач, но если основная задача — это высокая производительность и быстрая обработка статического контента, Nginx предоставляет более оптимизированное решение.