Apache mod_proxy недостаточно быстро закрывает внутренние сокеты
Я использую Apache + mod_proxy для предоставления приложения чата с Ejabberd. Он использует Bosh (XMPP через HTTP).
Проблема в том, что когда пользователь закрывает свой браузер, Apache некоторое время поддерживает соединение с внутренним сервером (около 1 минуты).
Меня это раздражает, потому что Ejabberd может понять, что пользователь ушел только тогда, когда сокет закрыт... так что собеседник пользователя не знает, что происходит в это время + собственный тайм-аут Ejabberd. Я могу изменить время ожидания Ejabberd, но я не мог понять, как сократить время закрытия на стороне Apache.
Посмотрите вывод netstat до закрытия браузера:
Браузер -> Apache mod_proxy
tcp 0 0 127.0.1.1:80 127.0.0.1:52361 TIME_WAIT
tcp 0 0 127.0.1.1:80 127.0.0.1:52380 ESTABLISHED
tcp 0 0 127.0.0.1:52380 127.0.1.1:80 ESTABLISHED
Apache mod_proxy -> Ejabberd
tcp 0 0 0.0.0.0:5280 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:5280 127.0.0.1:40972 ESTABLISHED
tcp 0 0 127.0.0.1:40953 127.0.0.1:5280 TIME_WAIT
tcp 0 0 127.0.0.1:40972 127.0.0.1:5280 ESTABLISHED
И после закрытия браузера, в течение десятков секунд до 1 минуты...
Браузер -> Apache mod_proxy
tcp 0 0 127.0.1.1:80 127.0.0.1:52361 TIME_WAIT
tcp 1 0 127.0.1.1:80 127.0.0.1:52380 CLOSE_WAIT
tcp 0 0 127.0.0.1:52380 127.0.1.1:80 FIN_WAIT2
Apache mod_proxy -> Ejabberd
tcp 0 0 0.0.0.0:5280 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:5280 127.0.0.1:40972 ESTABLISHED
tcp 0 0 127.0.0.1:40953 127.0.0.1:5280 TIME_WAIT
tcp 0 0 127.0.0.1:40972 127.0.0.1:5280 ESTABLISHED
Моя конфигурация Apache:
<VirtualHost *:80>
ProxyRequests On
ProxyPass /http-bind/ http://localhost:5280/http-bind/
ServerName desktop
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
RewriteEngine Off
[...]
</VirtualHost>