mod_jk与tomcat失去连接

8

我目前的生产服务器出了问题,这个问题是在过去几天才开始的。我正在运行apache httpd-2.2.3和tomcat-5.5.20,并使用mod_jk v1.3进行连接,在tomcat上托管一个Spring MVC站点。 发生的情况是,在网站运行约12小时后,我们的用户将无法访问。当这种情况首次发生时,我可以在catalina.out中看到几个以下错误:

WARN [org.apache.jk.core.MsgContext] Error sending end packet
java.net.SocketException: Broken pipe

在查阅相关资料后,我了解到这意味着用户在请求完成之前取消了该请求,因此返回路径被关闭,因此数据无法返回。从搜索网页上看,这可能会导致线程在Tomcat中保持打开状态,直到达到超时时间。当Tomcat崩溃时,这似乎是有道理的,因为我在catalina.out日志的末尾得到了相应信息。

All threads (200) are currently busy, waiting. Increase maxThreads (200) or check the servlet status

建议在apache httpd.conf中的JkModule设置中进行以下更改。
JkOptions +DisableReuse

在确保对我们的网站没有副作用之后,我这样做了,第二天它运行良好,但是昨天出现了相同的症状,网站冻结了。然而,这一次在catalina.out中没有任何错误,我们只是停止了到tomcat的请求。我可以从应用程序日志中看到最后一个请求是在17:31收到的,然后在mod_jk.log中我可以看到以下内容:

[Thu Sep 06 17:37:07 2012] [18784:53792] [error] ajp_connection_tcp_get_message::jk_ajp_common.c (947): (worker1) can't receive the response message from tomcat, network problems or tomcat is down (127.0.0.1:8009), err=-104
[Thu Sep 06 17:37:07 2012] [18784:53792] [error] ajp_get_reply::jk_ajp_common.c (1536): (worker1) Tomcat is down or refused connection. No response has been sent to the client (yet)

然后在我的httpd错误日志中发现:

[Thu Sep 06 17:38:39 2012] [error] server reached MaxClients setting, consider raising the MaxClients setting

因此,在我收到任何错误信息之前,已经过去了6分钟,然后在那之后又过了1分30秒,最大客户端错误出现。重新启动tomcat也解决了这个特定的问题。

除了我提到的更改(下面是当前配置),我们的apache、tomcat或连接器配置没有进行任何更改,但我们已经对我们的网站进行了更改,以每个用户执行更多的Ajax请求。因此,我想了解如何最好地分析我们的系统,以了解我可以做出哪些正确的设置更改,以确保我不会过载我们的服务器,但能够防止这种问题发生。

谢谢 Iain

当前配置

httpd.conf

Timeout 300
KeepAlive on
MaxKeepAliveRequests 100
KeepAliveTimeout 15

LoadModule jk_module modules/mod_jk.so
JkLogLevel    error
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkOptions     +ForwardKeySize +ForwardURICompat -ForwardDirectories +DisableReuse

workers.properties

# Define 1 real worker using ajp13
worker.list=worker1
# Set properties for worker1 (ajp13)
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
worker.worker1.lbfactor=50
worker.worker1.cachesize=10
worker.worker1.cache_timeout=600
worker.worker1.socket_keepalive=1
worker.worker1.recycle_timeout=300

httpd-mpm.conf

StartServers          5
MinSpareServers       5
MaxSpareServers      10
MaxClients          150 
MaxRequestsPerChild   0
设置就是标准的Tomcat设置。

你考虑过升级到Tomcat 6/7吗? - f_puras
我没有设置技术栈,希望不必升级。如果真的需要的话,可能要尝试一下,但我有一种感觉,只要有正确的配置就可以解决这个问题。 - sparkdoo
1个回答

3

事实证明,解决办法是更改keepalive超时时间。我只需要将KeepAliveTimeout从15更改为2,并添加MaxRequestsPerChild 5000即可阻止这种情况再次发生。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接