我得到一个间歇性的超时处理一些AJAX POST请求。 设置:Apache 2.2.17 - > mod_jk 1.2.26 - > JBoss 4.3 CP01(使用Tomcat 6.0)。应用程序使用JSF 1.2_11,Seam 2.1,RichFaces 3.3.1构建。
通常用于IE浏览器(7,8,9)。浏览器发送ajax请求(RichFaces为此生成JavaScript代码)。此HTTP POST请求通过mod_jk转换为AJP标头和正文包,并发送到Tomcat。标头包表示内容长度为1760,但是正文包在长度字段中为0且没有内容。使用tcpdump捕获数据包。每个有问题的请求都不会发生0 ajp正文包。所有ajax请求/响应都很小,高达30K,没有文件上传,也没有冗长的数据库查询。
在此阶段,mod_jk日志显示请求已在2分钟内处理完毕。在我们的测试环境中,我们还有2,3,4和6分钟。包装请求的应用程序过滤器也显示2分钟的时间;过滤器很简单 - 在请求之前和之后获取时间戳并记录差异。
调用应用程序的JSF阶段监听器,每个阶段(请求,视图恢复,验证,调用,呈现)大约为100毫秒 - 通常用于应用程序。因此,超时必须发生在请求开始之间(过滤之后和第一个JSF阶段之前)或结束之后(在渲染JSF阶段之后和过滤器结束之前)。
有时,mod_jk表示客户端读取超时;谁是客户端 - 浏览器,apache?在DEBUG级别的JBoss中没有记录任何异常。
有人遇到过类似的东西吗? mod_jk reply_timeout设置无法解决问题。直接连接到JBoss会给我们大约30秒的超时,这是我们以前从未见过的,我们不知道它是否与2分钟的超时有关。
答案 0 :(得分:0)
我们在IE中遇到了这个问题: http://support.microsoft.com/kb/821814。我们的KeepAliveTimeout设置为3s,服务器的响应有时会出现在边界上,导致Apache在响应头已经发送后丢弃连接。
我们的解决方案是双重基础设施:外部客户不会获得KeepAlive,因为他们不需要SSO登录。 Intranet客户端现在转到不同的Apache服务器(因为KeepAlive是服务器范围的,而不是特定于vhost的)。
答案 1 :(得分:0)
我们遇到过相同/类似的问题。我们注意到它正好是5分钟。我们使用的是Tomcat 6 / Apache AJP / Richfaces 3.3.3 Final。
我能够修改apache上的httpd.conf以获得一些满足感。
超时从5改为4分钟,这导致“超时”转移到4分钟而不是5分钟。所以我怀疑我是在正确的轨道上。
接下来,我将httpd.conf MaxKeepAliveRequests从默认值100修改为200,大大减少了“4分钟暂停”事件的数量。
编辑:
KeepAliveTimeout从10秒增加到40秒 MaxKeepAliveRequests设置为0(无限制)
这似乎已经消除了我们的问题。显然,这些设置需要根据服务器的流量类型/数量来设置,但这对我们有用。