
나는 Ejabberd와 함께 채팅 애플리케이션을 제공하기 위해 Apache + mod_proxy를 사용하고 있습니다. Bosh(HTTP를 통한 XMPP)를 사용하고 있습니다.
문제는 사용자가 브라우저를 닫을 때 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
내 아파치 구성 :
<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>