Node.js apache代理后的Sockjs/socketio断开延迟

Node.js apache代理后的Sockjs/socketio断开延迟,node.js,apache,socket.io,long-polling,Node.js,Apache,Socket.io,Long Polling,我需要处理用户断开与以xhr轮询模式运行的sockjs应用程序的连接。当我连接到localhost时,一切正常。当我把apache放在nodejs和浏览器之间时,在关闭的浏览器和nodejs内部的断开连接事件之间会有大约20秒的延迟。我的apache代理配置如下所示: <Location /> ProxyPass http://127.0.0.1:8080/ ProxyPassReverse http://127.0.0.1:8080/ </Location>

我需要处理用户断开与以xhr轮询模式运行的sockjs应用程序的连接。当我连接到localhost时,一切正常。当我把apache放在nodejs和浏览器之间时,在关闭的浏览器和nodejs内部的断开连接事件之间会有大约20秒的延迟。我的apache代理配置如下所示:

<Location />
  ProxyPass http://127.0.0.1:8080/
  ProxyPassReverse http://127.0.0.1:8080/
</Location>

ProxyPasshttp://127.0.0.1:8080/
ProxyPassReversehttp://127.0.0.1:8080/

文件的其余部分是默认的,您可以看到它。我尝试使用ttl=2和timeout=2选项,但要么什么都没有改变,要么每隔2秒就重新连接一次,而不关闭浏览器。如何减少额外的断开连接超时(引入了apache),但apache在其默认值的某个位置?

您的apache服务器可能被配置为使用它来保持持久连接打开。在这种情况下,我会尝试禁用
KeepAlive
,或者降低Apache配置中的
KeepAliveTimeout
设置,看看这是否解决了问题


如果这不起作用,我还将查看
netstat
,查看每个套接字的状态,并开始根本原因分析。这是TCP状态机,可以告诉您每个连接的位置。Wireshark还可以为您提供一些有关正在进行的操作的信息。

在长轮询中,连接如下所示

<client> ---> apache ---> <node.js>
这将在10秒后断开连接,但在10秒后每长时间轮询一次连接就会断开,这是您不希望的

Ping

下一个选项是ping客户端

<强> PiTimeOUT(数字)<强>:有多少个MS包没有考虑连接关闭(60000)

pingInterval(Number):发送新ping数据包(25000)前的毫秒数

以上将确保客户端在关机后5秒内断开连接,您可以再次将其降低,但这可能会影响通常的加载场景


但是通读所有的帖子、线程和站点,我不认为您可以直接复制连接到
socket.io
时的行为,因为连接中断很容易被
socket.io
检测到,20秒延迟不在apache代理中。我也遇到了同样的问题,延迟没有发生在本地URL中,而是延迟发生在全局URL中

这个问题在NodeJs中得到了解决。需要将一次性数据从服务器发送到客户端,以确保其已初始化。此问题不在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

sockjs首先尝试WebSocket,如果不可用,则使用轮询。当您将apache置于两者之间时,您只传递http,因此不允许ws-protocol,因此强制轮询。如果您在apache文件中启用mod_proxy_wstunnel(如本文所述),该怎么办@Bpurley,请仔细阅读问题,没有apache,我没有任何websocket数据传输,因为我已禁用websocket。您是否意识到检测与xhr轮询断开连接的唯一方法是超时?您只需知道客户机轮询间隔的设置,并将服务器超时设置为比客户机轮询间隔更长的时间,因此,如果在一段时间后没有看到任何客户机再次轮询,则您假定客户机一定已断开连接。根据轮询工作的本质,在任何情况下都无法及时断开轮询连接。不,可以在nodejs中处理断开连接,因为您可以注册此回调:req.on('close',function(){console.log(“byby”)}。即使sockjs inside有1s超时或心跳,我也不希望apache向其添加20秒。@StepanYakovenko您是否启用了HTTP保持活动?@jfriend00如果您希望添加一些内容,请在这次尊重地执行。尝试关闭Keepalive并调整KeepAliveTimeout 10,这没有帮助。另外,如果您查看ProxyPass文档,keepalive选项在默认情况下是禁用的。问题是关于sockjs,而不是websocket
ProxyTimeout 10
var io = require('socket.io')(server, { 'transports': ['polling'], pingTimeout: 5000, pingInterval: 2500});
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