You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使Apache反向代理支持Tomcat长轮询(Comet)连接?

解决Apache反向代理下Comet长轮询60秒超时问题

我帮你梳理下这个问题的核心:Apache的全局Timeout默认值(60秒)会覆盖你配置的ProxyTimeout,导致长轮询连接还没等到你的300秒Comet超时,就被Apache强制断开了。下面是一步步的解决方法:

1. 先修改Apache的全局超时设置

Apache的Timeout是全局控制所有请求的最大无数据传输时间,长轮询在等待推送期间没有数据流动,所以默认60秒后就会被掐断。你需要在Apache的主配置文件(比如httpd.conf或者对应的虚拟主机配置)里把这个值调得比你的Comet超时(300秒)更长,比如设成320秒:

Timeout 320

2. 确认ProxyPass参数的正确性

你的ProxyPass配置大部分是对的,但要注意几个细节:

  • timeout=310:这个是Apache代理请求的超时时间,和ProxyTimeout 310对应,设置没问题;
  • connectiontimeout=60:这是Apache与Tomcat建立连接的超时,不是长轮询的超时,保持60秒完全没问题;
  • keepalive=Onttl=350:确保Apache和Tomcat之间的长连接存活时间足够,当前设置是合适的。

完整的Apache代理配置应该包含全局Timeout设置,如下:

ProxyTimeout 310
Timeout 320
ProxyPass /Connect http://localhost:8080/Connect connectiontimeout=60 timeout=310 keepalive=On ttl=350
ProxyPassReverse /Connect http://localhost:8080/Connect

3. 检查Tomcat的Connector配置(可选但稳妥)

虽然你直接访问Tomcat时连接正常,但Tomcat的connectionTimeout="90000"(90秒)比你的Comet超时(300秒)短。不过Tomcat的CometProcessor会忽略这个全局连接超时,因为你已经通过event.setTimeout(300000)单独设置了Comet连接的超时,所以这个暂时不用改。但如果后续出现Tomcat主动断开的情况,可以把connectionTimeout调长到比300秒大,比如600秒:

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" 
           connectionTimeout="360000" redirectPort="8443" URIEncoding="UTF-8"/>

4. 重启服务测试

修改完配置后,一定要重启Apache和Tomcat服务,然后再测试长轮询连接,应该就能稳定保持300秒不超时了。


内容的提问来源于stack exchange,提问作者Bruce

火山引擎 最新活动