陈旧的networking连接到Tomcat AJP端口

我有使用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" /> 

我希望这个帮助。