2

我在处理一些 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 Header 和 body 数据包并发送到 Tomcat。头包说内容长度为1760,但主体包的长度字段为0,没有内容。使用 tcpdump 捕获数据包。0 ajp 正文数据包不会发生在每个有问题的请求中。所有 ajax 请求/响应都很小,最多 30K,没有文件上传,也没有冗长的数据库查询。

在这个阶段,mod_jk 日志显示请求在 2 分钟内处理完毕。在我们的测试环境中,我们也得到了 2、3、4 和 6 分钟。包装请求的应用程序过滤器也显示 2 分钟时间;过滤器很简单——在请求之前和之后获取时间戳并记录差异。

调用应用程序的 JSF 阶段侦听器,每个阶段(请求、视图恢复、验证、调用、渲染)大约需要 100 毫秒 - 通常用于应用程序。因此超时必须发生在请求开始(过滤器之后和第一个 JSF 阶段之前)或结束(渲染 JSF 阶段之后和过滤器结束之前)之间。

有时,mod_jk 说客户端读取超时;谁是客户端 - 浏览器,apache?在 JBoss 中,在 DEBUG 级别没有记录异常。

有人遇到过类似的事情吗?mod_jk reply_timeout 设置不能解决问题。直接连接到 JBoss 会给我们带来大约 30 秒的超时,这是我们以前从未见过的,我们不知道它是否与 2 分钟的超时有关。

4

2 回答 2

0

我们在 IE 中遇到了这个问题:http: //support.microsoft.com/kb/821814。我们的 KeepAliveTimeout 设置为 3 秒,来自服务器的响应有时会到达该边界,导致 Apache 在响应标头已发送后断开连接。

我们的解决方案是双重基础设施:外部客户端没有获得 KeepAlive,因为他们不需要 SSO 登录。Intranet 客户端现在转到不同的 Apache 服务器(因为 KeepAlive 是服务器范围的,而不是特定于虚拟主机的)。

于 2013-03-21T11:17:31.293 回答
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(无限制)

这似乎消除了我们的问题。显然,这些设置需要根据您服务器的流量类型/数量进行设置,但这对我们有用。

于 2013-08-20T11:01:38.280 回答