Ключевое различия между веб серверами: Apache, IIS vs Nginx, Node.js
На сегодняшний день популярными веб серверами являются: Apache, IIS, Nginx, Node.js. У каждого веб сервера есть своя история, фокус на технологиях, предпочитаемые ОС и многое другое.
Но есть принципиальное различие в процессе обработки запросов.
Для чего нужны веб серверы?
Для начало вспомним как работаю веб серверы. Веб серверы нужны для работы с веб приложениями по клиент-серверной модели. Их задача обработка запроса от пользователя(клиента, client) и возвращения результата запроса с сервера(backend, serverside). Подробнее можно ознакомиться на википедии: Client–server model.
Ресурсы веб серверов
Каждый сервер имеет выделенные “ресурсы”(Оперативная память, процессор и т.п.) для обработки запросов. Данные ресурсы используются в потоках и процессах:
- [Thread_(computing)]
- [Process_(computing)]
Различие в распределении ресурсов на обработку запросов является ключевым отличием для расматриваемых веб серверов.
Process-based web serves: Apache, IIS.
Apache, IIS используют обрабатывают каждый запрос в отдельном потоке/процессе - “process-based”.
На каждый запрос клиента используется отдельный процесс/поток. Каждый поток/процесс требует определенное кол-во ресурсов серверов. Ресурсы сервера “простаивают” пока ожидают отправку запроса и ответа клиента. Что отрицательно сказывается на производительности при высоких нагрузках, когда выделенных процессов поток недостаточно для обработки всех запросов.
Event-based web serves: Nginx, Node.js.
Event-based веб сервера работаю на одном процессе/потоке, используя все выделенные ресурсы.
loop-event - бесконечный цикл обработки запросов. Данный цикл отслеживает состояние запроса(прием запроса от клиента, обработка и отправка ответа).
В единичном процессе/потоке(Singe process/thread) используются все ресурсы веб сервера, позволяя обрабатывать запросы максимально быстро, а в случаи задержки(получение данных от клиента, отправки данных клиенту) работать с другими запросами из очереди(Event Queue) т.е асинхронно.
Итог
Схема event-based(Node.js, Nginx) показывает большую производительность при высоких нагрузках. Это связано с тем что не нужно делить ресурсы сервера между другими потоками/процессами. Также серверные ресурсы всегда используются без “простоя”.