![Apache mod_proxy 关闭后端套接字的速度不够快](https://linux22.com/image/630602/Apache%20mod_proxy%20%E5%85%B3%E9%97%AD%E5%90%8E%E7%AB%AF%E5%A5%97%E6%8E%A5%E5%AD%97%E7%9A%84%E9%80%9F%E5%BA%A6%E4%B8%8D%E5%A4%9F%E5%BF%AB.png)
我使用 Apache + mod_proxy 为 Ejabberd 提供聊天应用程序。它使用 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
和浏览器关闭后,数十秒到一分钟左右的时间……
浏览器 -> 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>