Sockjs / socketio断开apache代理后面的延迟

时间:2017-05-20 13:40:43

标签: node.js apache socket.io long-polling

我需要处理用户断开与我的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,默认情况下某处?

3 个答案:

答案 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