我使用 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.xml
tomcat 上AJP13型连接器部分,添加connectionTimeout
参数:
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"
connectionTimeout="300000" />
我希望这会有所帮助。