我需要处理用户断开与我的sockjs应用程序在xhr-polling模式下运行的连接。当我连接到localhost时,一切都按预期工作。当我在nodejs和浏览器之间放置apache时,我在闭合的浏览器和nodejs内的disconnect事件之间得到约20秒的延迟。我的apache代理配置如下:
<Location />
ProxyPass http://127.0.0.1:8080/
ProxyPassReverse http://127.0.0.1:8080/
</Location>
文件的其余部分是默认的,您可以看到它here。我尝试使用ttl = 2和timeout = 2选项,但要么没有任何改变,要么我每2秒重新连接一次而不关闭浏览器。我怎样才能减少额外的断开连接超时,但是apache,默认情况下某处?
答案 0 :(得分:1)
您的Apache服务器可能配置为使用HTTP Keep Alive来保持持久连接打开。在这种情况下,我会尝试禁用netstat
,或者降低Apache配置中的margin
设置,看看是否能解决问题。
如果这不起作用,我还会看一下padding
,看看每个套接字的状态是什么,然后开始根本原因分析。这个chart给出的是TCP状态机,可以告诉你每个连接的位置。 Wireshark还可以为您提供有关正在发生的事情的一些信息。
答案 1 :(得分:0)
在长轮询中,连接发生如下
<client> ---> apache ---> <node.js>
客户端断开连接时
<client> -X-> apache ---> <node.js>
Apache仍然保持连接打开。现在有两种解决方法
<强> ProxyTimeout 强>
您可以在下面添加到您的apache配置
ProxyTimeout 10
这将在10秒后中断连接,但是这会在10秒后中断每个长轮询连接,这是您不想要的
<强>平强>
下一个选项是ping客户端
pingTimeout(数字):没有pong数据包的多少ms考虑连接关闭(60000)
pingInterval(Number):发送新ping包(25000)前的ms数。
var io = require('socket.io')(server, { 'transports': ['polling'], pingTimeout: 5000, pingInterval: 2500});
以上将确保客户端在关闭后5秒内断开连接,您可以再次降低它,但这可能会影响通常的加载方案
但是阅读所有帖子,帖子和网站,我不认为你可以复制直接连接到socket.io
时所获得的行为,因为socket.io
可以轻松检测到连接中断{{ 1}}
答案 2 :(得分:0)
20秒延迟不在apache代理中。我遇到了同样的问题,本地URL中没有发生延迟,而全局URL中发生了延迟。
该问题已在NodeJ本身中解决。需要从服务器向客户端发送一次数据,以确保已初始化。该问题不在文档中,而是WebSocket插件的问题博客。
在服务器中接受请求后发送虚拟消息,如下所示。
let connection = request.accept(null, request.origin);
connection.on('message', function (evt) {
console.log(evt);
});
connection.on('close', function (evt) {
console.log(evt);
});
connection.send("Success"); //dummy message to the client from server