Длинные опции опроса: 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.

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

1 ответ

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

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

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

Я бы выбрал nginx в качестве общедоступного сервера и обращался к прокси-запросам по мере необходимости. Несмотря на то, что он обслуживает статические файлы немного медленнее, чем узел, его гибкость и простота настройки компенсируют это. 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 запускать ваше приложение, вы просто должны убедиться, что оно прослушивает только localhost и не обслуживает внешние запросы напрямую.

заявка

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, а также для очистки кеша.

Другие вопросы по тегам