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

У меня есть сервер приложений Tomcat, подключенный к серверу Apache с помощью коннектора mod_jk. Оба работают на разных серверах.

Apache -----> ------ Firewall -----> ------ 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?

1 ответ

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

Я надеюсь, что это поможет.

Другие вопросы по тегам