与 Tomcat AJP 端口的过时网络连接

与 Tomcat AJP 端口的过时网络连接

我使用 mod_jk 连接器将 Tomcat 应用程序服务器与 Apache 服务器连接起来。两者都在不同的服务器上运行。

Apache ----->------ 防火墙 ----->------ Tomcat

在过去的几天里,我发现 Tomcat AJP 连接器池中的线程数已满(100%),并且我发现 Apache 服务器出现错误。

故障排除步骤: 我已经停止了 Apache 服务器并在 Apache 服务器上运行了以下命令

> netstat -an | grep 8009 | wc -l
0

然后,我在 Tomcat 服务器上运行相同的命令,我可以看到从 Apache 到 AJP 端口的许多连接仍然处于建立状态。

> 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----

我已经等了一两个小时了,发现这些过时的连接仍然存在。

我有以下 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 问题?

答案1

默认情况下,mod_jk保留所有AJP13型连接无限期打开,但它不会通过 tcp 会话向 tomcat 服务器发送 keepalive。如果该连接处于空闲状态,它将保持打开状态。但是,防火墙不喜欢空闲会话,并且在一段时间不活动后,将切断该连接。这就是与应用程序的初始连接可能挂起的原因。AJP13型将把连接交给当前打开但防火墙已终止的 tcp 连接。

尝试为每个工人添加workers.properties以下参数:

worker.ajp13.socket_keepalive=True
worker.ajp13.connection_pool_timeout=300

server.xmltomcat 上AJP13型连接器部分,添加connectionTimeout参数:

<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"
connectionTimeout="300000" />  

我希望这会有所帮助。

相关内容