
Ejabberd でチャット アプリケーションを提供するために、Apache + mod_proxy を使用しています。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
そしてブラウザを閉じた後、数十秒から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>