Назад | Перейти на главную страницу

Устаревшие сетевые подключения к порту Tomcat AJP

У меня есть сервер приложений 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" />  

Надеюсь, это поможет.