
Ich verwende Apache + mod_proxy, um eine Chat-Anwendung mit Ejabberd bereitzustellen. Es verwendet Bosh (XMPP über HTTP).
Das Problem besteht darin, dass Apache die Verbindung zum Back-End-Server für eine Weile (ca. 1 Minute) aufrechterhält, wenn ein Benutzer seinen Browser schließt.
Es ärgert mich, weil Ejabberd erst dann erkennen kann, dass der Benutzer weg ist, wenn der Socket geschlossen wird. Der Gesprächspartner des Benutzers weiß also nicht, was während dieser Zeit passiert + Ejabberds eigenes Timeout. Ich kann Ejabberds Timeout ändern, aber ich konnte nicht herausfinden, wie ich die Schließzeit auf der Apache-Seite verkürzen kann.
Siehe netstats Ausgabebevor der Browser geschlossen wird:
Browser -> 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
Undnach dem Schließen des Browsers, während Dutzenden von Sekunden bis etwa einer Minute ...
Browser -> 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
Meine Apache-Konfiguration:
<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>