
我使用 Apache + mod_proxy 來提供 Ejabberd 的聊天應用程式。它使用 Bosh(XMPP over 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
和瀏覽器關閉後,在幾十秒到一分鐘左右的時間…
瀏覽器 -> 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
我的阿帕契配置:
<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>