也发布在这里: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
所以问题是:
- Nginx 如何处理 PHP 的非多线程特性 ;)。PHP 是否会像 Apache 一样成为长轮询的瓶颈?
- 我听说有人建议我在 Apache 和 Node.js 前面使用 nginx 作为反向代理,这是比仅使用 nginx 更好的解决方案吗?如果是,为什么?
- 您使用过/推荐哪种选项?
请记住,设置的简易性可能是一个因素,我对 Apache 相当熟悉,但我只玩过 Node(我有强大的 javascript)并且从未安装过 Nginx。
如果有人需要的话我很乐意提供澄清。
答案1
刚刚完成了一个涉及大量 nginx 反向代理的应用程序,我更倾向于选择第二个或第三个选项。...或者可能有些不同。让我们将其分解为需要考虑的各个要点:
静态文件
对于提供静态文件(用于网站或应用程序),node 和 nginx 是明确的选择,因为它们不会像 Apache 那样为每个新请求自行分叉。Node 是快点比 nginx 在提供静态文件方面更快,但根据您看到的流量量,这可能不是一个有意义的差异。
我会选择 nginx 作为面向公众的服务器,并根据需要将请求反向代理到其他服务器。尽管它在提供静态文件方面比 node 稍慢,但它的灵活性和易配置性弥补了这一点。如果您选择使用 PHP,使用 nginx 比使用 Apache 更快(配置正确),并且 nginx 的配置文件与 Apache 类似,但更简洁。当您深入研究它时,它应该不会太难懂。
SSL
如果您打算使用 SSL,请立即省去麻烦并获取最新版本的 nginx,以便您能够使用最新版本的 Google SPDY 模块。目前,最新版本是 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 这样的 Node 包使部署自动化变得简单。我使用它的一些事情是 HTML、CSS 和 JavaScript 压缩和缓存清除。