Назад | Перейти на главную страницу

Параметры длинного опроса: Nginx, PHP, Node.js

Также размещено здесь: https://stackoverflow.com/questions/8839295/long-polling-options-nginx-php-node-js

Я разрабатываю приложение для длительного опроса, чтобы очень быстро транслировать небольшие изменения, возможно, большому количеству пользователей. Приложение будет работать в тандеме с веб-сайтом, на котором установлена ​​довольно стандартная cms. Оба они будут работать на одном сервере, и для начала будет работать и база данных.

Я пришел из среды LAMP, и я определенно разработчик, а не системный администратор. Тем не менее, я не боюсь пробовать что-то новое.

Я провел день, исследуя свои варианты, и надеюсь, что люди ответят на некоторые вопросы и дадут мне несколько рекомендаций.

Я сузил круг вопросов до следующих:

A. Apache and php for the website, Node.js for the app (running on a separate ip)
B. Nginx and php for both the website and app
C. Nginx and php for website, Nginx and Node.js for the app

Итак, вопросы:

  1. Как Nginx справляется с многопоточностью PHP;). Окажется ли PHP таким же узким местом, как Apache для длительного опроса?
  2. Я слышал, что мне предлагали использовать nginx в качестве обратного прокси перед Apache и Node.js, это лучшее решение, чем просто nginx? Если да, то почему?
  3. Какой вариант вы использовали / порекомендовали бы?

Имейте в виду, что простота настройки может быть важным фактором, мне довольно комфортно с Apache, но я играл только с Node (у меня сильный javascript), и я никогда не устанавливал Nginx.

Я с радостью предоставлю разъяснения, если они кому-нибудь понадобятся.

Только что завершив приложение, в котором задействовано множество обратных прокси-серверов nginx, я был бы более склонен выбрать ваш второй или третий вариант. ... или, может быть, что-то другое. Давайте разберемся на отдельные моменты:

Статические файлы

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

Я бы выбрал nginx в качестве общедоступного сервера и при необходимости обратные прокси-запросы к другим вещам. Хотя он немного медленнее, чем node при обслуживании статических файлов, его гибкость и простота настройки компенсируют это. PHP, если вы решите его использовать, работает быстрее (правильно настроен) с nginx, чем с Apache, а файлы конфигурации nginx похожи на файлы Apache, но более лаконичны. Когда вы погружаетесь в нее, она не должна выглядеть слишком чужой.

SSL

Если вы планируете использовать SSL, избавьтесь от проблем сейчас и получите последнюю версию nginx, чтобы вы могли использовать последнюю версию модуля SPDY от Google. На данный момент последняя версия - 1.7.3. Некоторые менеджеры пакетов сильно отстают, поэтому вам, возможно, придется скомпилировать из исходников. В этом случае убедитесь, что --with-http_spdy_module --with-http_ssl_module флаги используются, среди прочего. Вот руководство для этого, а также настройку файлов конфигурации для использования SPDY.

Поскольку все ваши запросы проходят через nginx и одно доменное имя, вам нужно настроить SSL только в одном месте. Любые запросы с обратным проксированием не обязательно должны выполняться через HTTPS, потому что они выполняются внутри. Если вы заставляете node.js запускать ваше приложение, вам просто нужно убедиться, что он слушает только локальный хост и не обслуживает внешние запросы напрямую.

заявка

Node - хороший выбор для кода приложения и длительного опроса, который вы хотите выполнить. Также довольно просто проксировать эти длинные запросы на опрос через nginx. С этими двумя вариантами nginx ...

client_body_timeout 1m;
client_header_timeout 1m;

... вы можете настроить время ожидания запросов. Вам нужно убедиться, что код вашего приложения прекращает запросы до того, как это сделает nginx. В противном случае вы получите 504 Gateway Timeout вместо 200 ok. Если таймаут nginx установлен на 60 секунд, вы должны завершать и перезапускать длинный запрос на опрос каждые 55 секунд или около того.

Интернет сайт

Если вы не готовы к использованию PHP, node.js или генератор статических сайтов, написанный на node.js, также могут сработать для ваших нужд. Я использую Docpad, но есть много отличных вариантов. Пакеты узлов, такие как Grunt, упрощают автоматизацию развертывания. Я использую его для минимизации HTML, CSS и JavaScript и очистки кеша.