Также размещено здесь: 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
Итак, вопросы:
Имейте в виду, что простота настройки может быть важным фактором, мне довольно комфортно с Apache, но я играл только с Node (у меня сильный javascript), и я никогда не устанавливал Nginx.
Я с радостью предоставлю разъяснения, если они кому-нибудь понадобятся.
Только что завершив приложение, в котором задействовано множество обратных прокси-серверов nginx, я был бы более склонен выбрать ваш второй или третий вариант. ... или, может быть, что-то другое. Давайте разберемся на отдельные моменты:
Для обслуживания статических файлов (для веб-сайта или приложения) node и nginx - очевидный выбор, поскольку они не разветвляются для каждого нового запроса, как это делает Apache. Узел Быстрее чем nginx при обслуживании статических файлов, но в зависимости от объема трафика, который вы увидите, это может быть несущественной разницей.
Я бы выбрал nginx в качестве общедоступного сервера и при необходимости обратные прокси-запросы к другим вещам. Хотя он немного медленнее, чем node при обслуживании статических файлов, его гибкость и простота настройки компенсируют это. PHP, если вы решите его использовать, работает быстрее (правильно настроен) с nginx, чем с Apache, а файлы конфигурации nginx похожи на файлы Apache, но более лаконичны. Когда вы погружаетесь в нее, она не должна выглядеть слишком чужой.
Если вы планируете использовать 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 и очистки кеша.