Upgrade your nginx server {} config:
fastcgi_keep_conn on; # < solution
proxy_buffering off;
gzip off;
本地测试都没问题。 但是放到服务器上就有问题了。服务器上用了 nginx做负载均衡 。服务器上我测试了一下,如果用局域网ip(跳过nginx)来测试没问题,数据能够推送,但是如果用到了nginx就不行。 经过 搜索。。找到了问题。
对于基于长轮询(long-polling)的Comet 应用来说,关闭 proxy_buffering 是重要的,不然异步响应将被缓存导致Comet无法工作
参考网站 http://blog.csdn.net/ikmb/article/details/7098080
其他参考:http://stackoverflow.com/questions/12404469/how-to-use-comet-disable-output-buffering-in-nginx-it-works-in-apache-normally
5
|
Upgrade your nginx server {} config:
| ||||
|
(观察发现,非nginx下的时候,有一个请求是一直等待的,过了固定的时间【后来发现就是timeout配置的时间】,就会自动再发起一个请求在等待【pengding】,但是nginx的时候,到了固定的时间,直接就返回500错误了。)
我尝试把Comet.Timeout 从 60000 1分钟调整到了10000 20秒,可以了。。 猜测难道是Comet.Timeout 比 >Comet.CacheExpires 或者Comet.CacheFrequency 参数 要小 所以可以了? 不管了, 后面再尝试把
参考:http://www.cnblogs.com/javapy/archive/2012/11/22/2783043.html
说到:proxy_read_timeout必须大于应用的超时。否则将会有504请求返回。
但是我的Comet.Timeout 位20秒 不知道这是不是应用的超时设置? 不过比 proxy_read_timeout 的 5000 要大。
upstream frontends { server 127.0.0.1:8999; } server { listen 8888; location / { proxy_read_timeout 1800; proxy_pass_header Server; proxy_set_header Host $http_host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_pass http://frontends; } }
此配置采用proxy upstream到backend的原因是方便upstream负载均衡,只需要upstream中添加多几个ip端口即可。前面提过,Tornado是单线程Server,启动cpu核数个Tornado进程并绑定到cpu,能够提高机器的吞吐量。
需要特别指出的是,要根据上述应用的超时机制,设置proxy_read_timeout,proxy_read_timeout必须大于应用的超时。否则将会有504请求返回。
至此,一个Comet应用的服务器端就完成了。由于Comet使用的是长连接机制,需要特别注意从客户端到真正后端程序之间每个环节的超时机制,而且网络连接的不可靠性影响将会更大,需要考虑更多边界条件。