Следует ли сочетать Nginx с языком, поддерживающим модель асинхронного программирования?

Я обнаружил, что в Интернете есть много статей, сравнивающих Nginx и Apache. Однако все эти сравнения основаны на стресс-тесте веб-сервера, на котором выполняется код PHP. Я предполагаю, что это в основном связано с тем, что Apache обычно развертывается с PHP в качестве архитектуры LAMP.

Насколько я понимаю, Nginx создан для решения проблемы C10K с архитектурой на основе событий. То есть Nginx должен обслуживать M одновременных запросов с N потоками / процессами. Предполагается, что N намного меньше M. Это большое отличие от Apache, которому требуется M потоков / процессов для обслуживания M одновременных запросов.

Для кода PHP модель программирования не является асинхронной. Каждый веб-запрос будет занимать один поток / процесс, чтобы PHP мог его обработать. Итак, я не понимаю смысла сравнивать Nginx и Apache с кодом PHP.

Архитектура Nginx, основанная на событиях, должна превосходить Apache, особенно когда запросы связаны с операциями ввода-вывода. Например, запросы должны объединять результаты нескольких других веб-служб. Для Apache + PHP каждый запрос может занимать секунды, просто ожидая завершения операции ввода-вывода. Это потребует много потоков / процессов. Для Nginx это не проблема, если используется асинхронное программирование.

Было бы разумнее развернуть Nginx с языком, поддерживающим модель асинхронного программирования?

Я не уверен, какой язык программирования может раскрыть наибольший потенциал Nginx, но это определенно не PHP.


person Morgan Cheng    schedule 25.07.2010    source источник


Ответы (2)


Прежде всего, nginx не поддерживает выполнение каких-либо приложений напрямую. Он может обслуживать статические файлы, запросы прокси к любому другому веб-серверу и некоторые другие мелочи. Исторически сложилось так, что nginx был нацелен на обработку множества сетевых подключений, правда, но логическое обоснование было таким: пока apache не ответит на запрос кого-то при медленном подключении, он ничего не может сделать. У Apache есть ограничение на количество рабочих, поэтому при большом количестве медленных клиентов любой новый должен ждать, пока рабочий завершит передачу и возобновит прием нового запроса. Итак, классическая установка - nginx принимает внешние запросы, проксируя их на локальный apache; apache обрабатывает запросы и возвращает ответы nginx для передачи клиентам. Таким образом, apache исключается из работы с клиентами.

По поводу вопроса и nginx на картинке. В наши дни не так уж и сложно использовать фреймворки системных событий. Это epoll для Linux, kqueue для FreeBSD и другие. На уровне приложения много вариантов, например, для Python. Итак, все, что вам нужно сделать, это написать приложение с этими фреймворками, которые 1) обычно помещают вас в мир асинхронности и 2) дают вам способ создания службы HTTP, готовой к работе с nginx. Вероятно, это то, к чему вы стремитесь.

Таким образом, c10k не представляет проблемы ни для nginx, ни для приложений, построенных на этих фреймворках. Пример под рукой - сервер торнадо friendfeed: написан python, в зависимости от системы использует epoll и kqueue, насколько я помню, легко обрабатывает до 8k. Были некоторые тесты и запоздалая мысль о его дальнейшем масштабировании.

Должно быть, что-то назревает в рубиновом мире по поводу всей асинхронной тенденции, чтобы они могли придумать, если они еще не сделали. Пассажир и дворняга Ruby, какими бы они ни были по сути (я не говорю об этом), работают с nginx, и для этого требовалось писать модули для nginx. Таким образом, сообщество принимает во внимание nginx и делает дополнительные, когда это необходимо.

Php, кстати, остается актуальным для push-уведомлений при массовом развертывании веб-сокетов. Ну что ж.

person rzab    schedule 25.07.2010
comment
Спасибо за ответ, но я совершенно ясно понимаю, что Php, кстати, остается актуальным для push-уведомлений при массовом развертывании веб-сокетов. Насколько я понимаю, PHP не подходит для реализации на стороне сервера Comet, верно? - person Morgan Cheng; 26.07.2010
comment
Ну, я в этом не уверен. Под apache это явно не слетит. Но что касается PHP-сервера, фреймворк должен быть доступен через какой-то интерфейс. Но да, это непрактично. Comet, в чем бы она ни реализована, может быть только сервером очереди сообщений. Все, что помещается в очередь, возвращается клиенту. Таким образом, любой код, когда ему нужно что-то подтолкнуть, выдает сообщение серверу кометы. Это автономный сервер, и вам не нужно переписывать весь код асинхронно. Вот к чему сводилась любая попытка заставить PHP каким-то образом обслуживать запросы на длительный опрос, которые я видел. - person rzab; 26.07.2010

Дело в том, что потенциал не имеет значения. PHP - это что-то вроде стандарта для веб-разработки, и это то, что люди обычно заботят о серверах, поэтому только потому, что Ngnix или Apache оптимизированы для запуска непонятного языка программирования в y раз быстрее, чем другой, не имеет значения, если это не PHP.

person 46bit    schedule 25.07.2010
comment
Я забываю подчеркнуть, что модель Nginx лучше, если каждый запрос требует операций ввода-вывода. Я обновил вопрос. - person Morgan Cheng; 25.07.2010