У меня есть сервер приложений 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 соединения открываются бесконечно, но он не отправляет пакеты keepalive через сеанс tcp на сервер tomcat. Если это соединение неактивно, оно останется открытым. Брандмауэры, однако, не любят бездействующие сеансы и после определенного периода бездействия разрывают это соединение. Вот почему первоначальное соединение с приложением может зависнуть. ajp13 передаст соединение TCP-соединению, которое в настоящее время открыто, но брандмауэр отключил это соединение.
Попробуй добавить workers.properties
, это параметры для каждого рабочего:
worker.ajp13.socket_keepalive=True
worker.ajp13.connection_pool_timeout=300
В server.xml
на кота ajp13 раздел соединителя, добавьте connectionTimeout
параметр:
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"
connectionTimeout="300000" />
Надеюсь, это поможет.