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

如何为长轮询配置nginx(和php),php,ubuntu,nginx,Php,Ubuntu,Nginx,我正在创建一个简单的聊天应用程序。已经在Ubuntu11.10上安装了nginx,并通过FastCGI使用PHP。为了了解性能,我制作了一个简单的PHP文件,可以休眠10秒,然后报告时间。使用多个浏览器实例(不同的浏览器、不同的机器)进行调用,在大约10个实例之后,响应会变得缓慢,比预期的要小得多(我们希望在数百个实例之前不会看到任何恶化,尽管使用手动浏览器测试是不实际的) 我是一个网络开发人员,不是系统管理员,也许我不了解?不寻求最佳解决方案(搜索显示nginx应该能够处理每个核心10k),但

我正在创建一个简单的聊天应用程序。已经在Ubuntu11.10上安装了nginx,并通过FastCGI使用PHP。为了了解性能,我制作了一个简单的PHP文件,可以休眠10秒,然后报告时间。使用多个浏览器实例(不同的浏览器、不同的机器)进行调用,在大约10个实例之后,响应会变得缓慢,比预期的要小得多(我们希望在数百个实例之前不会看到任何恶化,尽管使用手动浏览器测试是不实际的)

我是一个网络开发人员,不是系统管理员,也许我不了解?不寻求最佳解决方案(搜索显示nginx应该能够处理每个核心10k),但几百个就好了


还有Nginx推流模块,但我不知道如何安装它,似乎还有另一种技术需要掌握。基本现成的nginx是否能够满足我的期望,即使用PHP进行100多个长期连接?

您需要配置订阅和发布的端点。将以下内容添加到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;
}
见文件

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


从技术上讲,推送流模块将执行您希望它执行的操作——设置一个url,您可以在其中推送更新,然后pubsub可以在客户端代码中轮询更新

为了安装推流模块,您需要获取最新的nginx源代码,获取该模块的源代码,对其进行编译,然后使用指向新模块源代码的路径作为标志之一重新编译nginx。看看我是怎么做到的,这里:

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


一旦您确认它实际上已在nginx中安装并运行,然后按照@baba提供的步骤操作。您能介绍到目前为止如何配置nginx吗?您对您的配置有何看法?在我看来,对您来说,最关键的配置应该是工作进程、工作连接、打开\u文件\u缓存并在这里保存生命。下面是一篇涵盖所有这些内容的好文章:

此外,您可能还想进一步了解指令:

我以前用2和10240配置过工作进程和工作连接,keepalives>20。希望这对你有帮助


**哦,我还忘了提到——也许操作码缓存可以为您工作?尝试安装PHP-APC

设置:工作进程2;工人(1024);;我应该提到这是在Amazon micro实例上的,RackSpace 256512MB实例-几乎相同的响应。酷!我还使用了一个Amazon微实例。然而,我认为他需要的是长时间执行脚本。。我之所以将worker_connections提升到10240,是因为我在其上运行了一个Magento应用程序,所以在执行大量重新索引时,我看不到任何性能影响。我还将配置与Varnish缓存和PHP-APC相结合。