长轮询选项:Nginx,PHP,Node.js

也张贴在这里: https : //stackoverflow.com/questions/8839295/long-polling-options-nginx-php-node-js

我正在devise一个长轮询应用程序,可以很快地向很大数量的用户发送小的更改。 该应用程序将与运行相当标准的CMS网站串联运行。 他们都将在一台服务器上运行,并开始数据库。

我来自一个LAMP环境,我绝对是一个开发人员,而不是一个系统pipe理员。 这就是说,我不害怕尝试一些新的东西。

我花了一天时间研究我的select,我希望人们可以回答一些问题,并给我一些build议。

我已经缩小到这些:

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的非multithreading;)。 PHP会certificateApache是​​否具有长时间轮询的瓶颈?
  2. 我听说它build议我使用nginx作为Apache和Node.js前面的反向代理,这是比nginx更好的解决scheme吗? 如果是这样,为什么?
  3. 你使用了哪个选项?

请记住,简单的设置可能是一个因素,我相当适应Apache,但我只使用节点(我有强大的JavaScript),我从来没有安装Nginx。

如果有人需要,我会很乐意提供澄清。

刚刚完成了一个涉及大量nginx反向代理的应用程序,我会更倾向于select第二个或第三个选项。 …或者可能稍有不同。 让我们把它分解到个别点来考虑:

静态文件

为了提供静态文件(无论是网站还是应用程序),节点和nginx是明确的select,因为它们不像Apache那样为每个新的请求分派自己。 在提供静态文件时,节点比nginx 速度更快 ,但根据您将看到的stream量,这可能没有什么意义。

我会selectnginx作为面向公众的服务器,并根据需要反向代理请求其他的东西。 即使它在服务静态文件时比节点稍慢,它的灵活性和易于configuration也弥补了这一点。 PHP,如果你select使用它,使用nginx的速度比使用Apache更快(configuration正确),nginx的configuration文件与Apache相似,但更简洁。 当你潜入其中时,不应该太过于外向。

SSL

如果您打算使用SSL,那么现在就省去麻烦,并获取最新版本的nginx,以便您可以使用最新版本的Google SPDY模块。 目前最新版本是1.7.3。 一些软件包pipe理器已经落后了很多,所以你可能需要从源代码编译。 如果是这种情况,请确保使用--with-http_spdy_module --with-http_ssl_module标志等等。 这里是一个指南 ,以及设置configuration文件使用SPDY。

由于您的所有请求都是通过nginx和单个域名进行的,因此您只需要在一个地方设置SSL。 任何反向代理请求都不需要通过HTTPS,因为它们在内部发生。 如果你让node.js运行你的应用程序,你只需要确保它只在本地主机上侦听,并且不直接提供外部请求。

应用

节点是您希望完成的应用程序代码和长轮询的不错select。 通过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是我使用的,但有很多很好的select。 像Grunt这样的节点包使得部署自动化变得简单。 我使用它的一些东西是HTML,CSS和JavaScript缩小和caching破坏。