Как работает неукладывающий веб-сервер? - PullRequest
9 голосов
/ 27 мая 2009

Веб-серверы без разветвления (или однопоточные или select()), такие как lighttpd или nginx набирает популярность все больше и больше.

Хотя существует множество документов, объясняющих разветвление серверов (в различные уровни детализации), документация для серверов не разветвляется скудно.

Я ищу птичьи глаза представление о том, как a веб-сервер без разветвлений работает . (Псевдо-) код или схема конечного автомата, обнаженная до гола минимум, было бы здорово.

Мне известны следующие ресурсы, и они показались мне полезными.

Однако меня интересуют принципы, а не детали реализации.

В частности:

  • Почему этот тип сервера иногда называют неблокирующим, когда select() по существу блокирует?

  • Обработка запроса может занять некоторое время. Что происходит с новыми запросами в это время, когда нет определенного потока или процесса слушателя? Обработка запроса как-то прервана или отрезана по времени?

Edit: Насколько я понимаю, во время обработки запроса (например, чтение файла или выполнение сценария CGI) Сервер не может принимать новые подключения. Не означает ли это, что такой сервер может сильно пропустить новых соединений, если скрипт CGI выполняется, скажем, в течение 2 секунд или около того?

Ответы [ 2 ]

8 голосов
/ 27 мая 2009

Базовый псевдокод:

setup
while true
    select/poll/kqueue
    with fd needing action do
        read/write fd
        if fd was read and well formed request in buffer
            service request
        other stuff
  • Хотя select() и друзья блокируют, сокет ввода-вывода не блокируется. Ты блокируешься только до тех пор, пока тебе не будет чем заняться.
  • Обработка отдельных запросов обычно включала чтение дескриптора файла из файла (статический ресурс) или процесса (динамический ресурс), а затем запись в сокет. Это может быть сделано удобно, не сохраняя много состояния.
  • Таким образом, service request выше обычно означает открытие файла, добавление его в список для select и обнаружение того, что данные, прочитанные оттуда, поступают в определенный сокет. При необходимости замените файл FastCGI на файл.

EDIT:

  • Не уверен насчет остальных, но в nginx есть 2 процесса: мастер и рабочий. Мастер выполняет прослушивание, а затем передает принятое соединение работнику для обработки.
4 голосов
/ 27 мая 2009

select () PLUS неблокирующий ввод / вывод , по сути, позволяет управлять несколькими соединениями / отвечать на них, когда они входят в один поток ( мультиплексирование ), в отличие от наличия нескольких потоков / процессов обрабатывать одну розетку каждый. Цель состоит в том, чтобы минимизировать отношение площади сервера к количеству соединений.

Это эффективно, поскольку этот единственный поток использует высокий уровень активных соединений сокетов, необходимых для достижения насыщения (поскольку мы можем выполнять неблокирующий ввод / вывод для нескольких файловых дескрипторов).

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

Сервер этого типа всегда ожидает подключения, блокируя выбор (). Как только он получает его, он обрабатывает соединение, а затем повторно обращается к select () в бесконечном цикле. В простейшем случае этот серверный поток НЕ блокирует любое другое время, кроме случаев, когда он настраивает ввод / вывод.

Если будет установлено второе соединение, оно будет обработано в следующий раз, когда сервер выберет select (). В этот момент первое соединение все еще может быть получено, и мы можем начать отправку во второе соединение из того же потока сервера. Это цель.

Поиск " мультиплексных сетевых сокетов " для дополнительных ресурсов.

Или попробуйте Unix Network Programming от Стивенса, Феннера, Рудоффа

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