У меня есть два прокси-сервера балансировки нагрузки apache (с именами A1, A2), работающие с mod_jk, и два веб-сервера Jboss (с именами J1, J2).
Версия Jboss — jboss-eap-5.1. Версия Apache 2.2.15. ОС: Red Hat Enterprise Linux Server версии 6.4 (Сантьяго). И A1, и A2 могут перенаправить запрос (с портом 80) извне на J1, J2 (оба порта 8080). Настройки A1, A2 одинаковы (кроме HostIP). J1, J2 также имеют одинаковые настройки (кроме HostIP и jvmRoute).
У меня есть некоторые проблемы с этой архитектурой. J1 и J2 могут хорошо обработать запрос A1 (получить запрос -> создать поток для обработки -> завершить процесс -> закрыть поток).
Но запрос А2 странный. Когда процесс завершился, поток не закрылся. И сетевое подключение останется в состоянии ESTABLISHED. Я использовал jstack PID для проверки, и есть много следующих утверждений:
"ajp-XX.XX.72.12-8009-240" daemon prio=10 tid=0x00007f791418e800 nid=0x7793 runnable [0x00007f7875d5c000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at org.apache.coyote.ajp.AjpProcessor.read(AjpProcessor.java:1036)
at org.apache.coyote.ajp.AjpProcessor.readMessage(AjpProcessor.java:1115)
at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:383)
at org.apache.coyote.ajp.AjpProtocol$AjpConnectionHandler.process(AjpProtocol.java:385)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:451)
at java.lang.Thread.run(Thread.java:662)`
Сравнил приведенный выше PID (nid=0x7793) с ps -efT | grep 30611 можно получить следующее: `xxxx 17869 30611 17821 0 20:40 ? 00:00:00 /usr/local/java/bin/java -program.name=run.sh ...
И хотя я использую netstat -A inet, таких подключений много:
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 npouiap2:8009 10.100.84.34:49666 ESTABLISHED
tcp 0 0 npouiap2:8009 10.100.84.34:50374 ESTABLISHED
tcp 0 0 npouiap2:8009 10.100.84.34:50507 ESTABLISHED