我有使用mod_jk连接器与Apache服务器连接的Tomcat应用程序服务器。 两者都在不同的服务器上运行。
Apache —–> ——防火墙—–> —— Tomcat
在过去的几天里,我看到Tomcat AJP连接器池中的线程数正在被填充(100%)而我在Apache服务器中看到错误。
故障排除步骤:我停止了Apache服务器并在Apache服务器上运行以下命令
> netstat -an | grep 8009 | wc -l 0
然后,我在Tomcat服务器上运行相同的命令,我可以看到从Apache到AJP端口的许多连接仍处于build立状态。
> netstat -an | grep 8009 tcp 0 0 :::8009 :::* LISTEN tcp 0 0 ::ffff:192.168.1.75:8009 ::ffff:192.168.10.75:56840 ESTABLISHED tcp 0 0 ::ffff:192.168.1.75:8009 ::ffff:192.168.10.75:56838 ESTABLISHED ---deleted remaining lines----
我已经等了1-2个小时,我可以看到这些陈旧的连接仍然存在。
我有以下的Tomcat设置:
tomcat.maxthreads=200 tomcat.minsparethreads=50 tomcat.maxidletime=10000 tomcat.acceptcount=100
线程转储显示以下线程:
"ajp-bio-8009-exec-70" daemon prio=10 tid=0x00007fb87c3a1800 nid=0x302b runnable [0x00007fb8605c4000] java.lang.Thread.State: RUNNABLE at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:152) at java.net.SocketInputStream.read(SocketInputStream.java:122) at org.apache.coyote.ajp.AjpProcessor.read(AjpProcessor.java:312) at org.apache.coyote.ajp.AjpProcessor.readMessage(AjpProcessor.java:367) at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:118) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314) - locked <0x000000051b0a2ee0> (a org.apache.tomcat.util.net.SocketWrapper) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745)
我需要重新启动来清除Tomcat的所有陈旧连接。
请帮我解决这个问题。 这是由于服务器问题?或Tomcat或mod_jk问题。
默认情况下, mod_jk
保持所有的ajp13连接无限期打开,但是不会通过tcp会话向tomcat服务器发送keepalive。 如果连接闲置,它将保持打开状态。 然而,防火墙不喜欢空闲会话,经过一段时间不活动后,将断开连接。 这就是为什么初始连接到应用程序可能会挂起。 ajp13会将连接closures到当前打开的tcp连接,但是防火墙已经终止了该连接。
尝试添加workers.properties
,这个参数为每个worker:
worker.ajp13.socket_keepalive=True worker.ajp13.connection_pool_timeout=300
在tomcat ajp13连接器部分的server.xml
,添加connectionTimeout
参数:
<!-- Define an AJP 1.3 Connector on port 8009 --> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" connectionTimeout="300000" />
我希望这个帮助。