如何配置nginx进行长轮询(和php)

时间:2012-04-19 22:27:35

标签: php ubuntu nginx

我正在创建一个简单的聊天应用。已经在Ubuntu 11.10上安装了nginx,通过fast-cgi安装了PHP。为了感受性能,我做了一个简单的PHP文件,睡眠时间为10秒,然后报告时间。用几个浏览器实例(不同的浏览器,不同的机器)调用它,响应在大约10个实例后变得迟缓,比预期少得多(希望在数百个之前看不到任何恶化,尽管使用手动浏览器测试这是不切实际的)

我是一个web-dev,而不是sys-admin,可能不是我的深度?不寻找最佳解决方案(搜索显示nginx应该能够处理每个核心10k),但几百个会很棒。

还有Nginx推送流模块,但我无法弄清楚如何安装它,似乎还有另一种技术可以解决。基本开箱即用的nginx应该能够应付我的期望,即使用PHP进行100多个长期连接吗?

3 个答案:

答案 0 :(得分:1)

您需要配置订阅和发布的终点。将以下内容添加到您的nginx.conf文件中:

# internal publish endpoint (keep it private / protected)
location /publish {
  set $push_channel_id $arg_id;      #/?id=239aff3 or somesuch
  push_publisher;

  push_store_messages on;            # enable message queueing
  push_message_timeout 2h;           # messages expire after 2 hours, set to 0 to never expire
  push_message_buffer_length 10;     # store 10 messages
}

# public long-polling endpoint
location /subscribe {
  push_subscriber;

  # how multiple listener requests to the same channel id are handled
  # - last: only the most recent listener request is kept, 409 for others.
  # - first: only the oldest listener request is kept, 409 for others.
  # - broadcast: any number of listener requests may be long-polling.
  push_subscriber_concurrency broadcast;
  set $push_channel_id $arg_id;
  default_type  text/plain;
}

参见文件

http://www.brentsowers.com/2011/06/http-long-polling-aka-comet-with-nginx.html

http://www.igvita.com/2009/10/21/nginx-comet-low-latency-server-push/

如果您想将其转换为完整的COMET服务器,可以使用

https://github.com/slact/nginx_http_push_module

答案 1 :(得分:1)

推送流模块在技术上会按照您的意愿执行操作 - 设置一个可以推送更新的网址,然后可以通过客户端代码中的pubsub进行轮询。

为了安装推送流模块,你需要获取最新的nginx源代码,获取该模块的源代码,编译它,然后使用新模块源代码的路径重新编译你的nginx 旗帜。看看我是怎么做到的,在这里:

Recompiling nginx after using apt-get install nginx

如果重新启动nginx服务器未在当前实例的列出标志中列出该模块,则在重新编译期间未正确覆盖nginx文件。确保包含--sbin-path标志以确保覆盖正确的目录。

一旦确认它已经在nginx中安装并运行,请按照@baba提供的步骤进行操作

答案 2 :(得分:0)

到目前为止,你能说明你如何配置Nginx吗?以及您对配置的看法?在我看来,最重要的配置应该是工作进程,工作者连接,open_file_cache并在此处保持活力。这是一篇很好的文章,涵盖了所有这些:

http://blog.martinfjordvald.com/2011/04/optimizing-nginx-for-high-traffic-loads/

您也可以查看更多指令:

http://wiki.nginx.org/HttpCoreModule

我之前使用2和10240配置了工作进程和工作者连接,使用keepalive> 20.希望对你有所帮助。

**哦,我也忘了提 - 也许Opcode缓存可以为你工作?尝试安装PHP-APC。