Устаревшие Сетевые соединения с портом 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.?

2
задан 12 December 2014 в 14:29
1 ответ

По умолчанию, 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" />  

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

.
3
ответ дан 3 December 2019 в 10:44

Теги

Похожие вопросы