nginx com4j 500问题

本地测试都没问题。 但是放到服务器上就有问题了。服务器上用了 nginx做负载均衡 。服务器上我测试了一下,如果用局域网ip(跳过nginx)来测试没问题,数据能够推送,但是如果用到了nginx就不行。 经过 搜索。。找到了问题。


对于基于长轮询(long-polling)的Comet 应用来说,关闭 proxy_buffering 是重要的,不然异步响应将被缓存导致Comet无法工作

server {

proxy_buffering:off  ;

参考网站 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 down vote accepted

Upgrade your nginx server {} config:

fastcgi_keep_conn on; # < solution

proxy_buffering off;
gzip off;
share improve this answer
 
 
Combined with setting header('Content-Encoding: none;'); at the start of my php file, this worked for me. Thanks. –  markashworth  Jul 28 '15 at 12:26 

但是后面测试发现还是有问题。如果等上1分钟不报价就有问题。但是没有用nginx的就没问题,很奇怪。

(观察发现,非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使用的是长连接机制,需要特别注意从客户端到真正后端程序之间每个环节的超时机制,而且网络连接的不可靠性影响将会更大,需要考虑更多边界条件。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值