Мне подключили Сервер приложений Tomcat с сервером Apache с помощью mod_jk коннектор. Оба работают на различных серверах.
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----
Я ожидал в течение 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 соединения открытыми бессрочно, но не посылает keepalives через tcp-сессию на tomcat-сервер. Если это соединение простаивает, оно остается открытым. Брандмауэры, однако, не любят простаивающие сессии и после периода неактивности разорвут это соединение. Вот почему первоначальное соединение с приложением может зависнуть. ajp13 передаст соединение на tcp-соединение, которое в данный момент открыто, но брандмауэр его отключил.
Попробуйте добавить работников. Свойства
, эти параметры для каждого рабочего:
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" />
Надеюсь, это поможет.
.