Ключевое различия между веб серверами: 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”.

Responsive image

Схема работы “process-based” веб серверов.

На каждый запрос клиента используется отдельный процесс/поток. Каждый поток/процесс требует определенное кол-во ресурсов серверов. Ресурсы сервера “простаивают” пока ожидают отправку запроса и ответа клиента. Что отрицательно сказывается на производительности при высоких нагрузках, когда выделенных процессов поток недостаточно для обработки всех запросов.

Event-based web serves: Nginx, Node.js.

Event-based веб сервера работаю на одном процессе/потоке, используя все выделенные ресурсы.

Responsive image

Схема работы Event-based веб сервера.

loop-event - бесконечный цикл обработки запросов. Данный цикл отслеживает состояние запроса(прием запроса от клиента, обработка и отправка ответа).

В единичном процессе/потоке(Singe process/thread) используются все ресурсы веб сервера, позволяя обрабатывать запросы максимально быстро, а в случаи задержки(получение данных от клиента, отправки данных клиенту) работать с другими запросами из очереди(Event Queue) т.е асинхронно.

Итог

Схема event-based(Node.js, Nginx) показывает большую производительность при высоких нагрузках. Это связано с тем что не нужно делить ресурсы сервера между другими потоками/процессами. Также серверные ресурсы всегда используются без “простоя”.

Ссылки