【发布时间】:2017-10-20 13:26:36
【问题描述】:
我需要处理与我的 sockjs 应用程序断开连接的用户在 xhr-polling 模式下运行。当我连接到本地主机时,一切都按预期工作。当我将 apache 放在 nodejs 和浏览器之间时,我在关闭浏览器和 nodejs 内的断开事件之间得到约 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,在其默认值的某个地方?
【问题讨论】:
-
sockjs 首先尝试 websockets,如果不可用,则使用轮询。当您将 apache 放在两者之间时,您只传递了 http,因此您不允许 ws 协议,因此强制进行轮询。如果您在 apache 文件中启用 mod_proxy_wstunnel 会怎样,如此处所述...httpd.apache.org/docs/2.4/mod/mod_proxy_wstunnel.html
-
@bpursley,请仔细阅读问题,没有 apache,我没有任何 websocket 数据传输,因为我禁用了 websockets。
-
您是否意识到检测与 xhr-polling 断开连接的唯一方法是超时?您只需要知道客户端轮询间隔设置为什么并将服务器超时设置为比客户端轮询间隔更长的时间,因此如果您在一段时间后没有看到任何客户端再次返回轮询,那么您假设客户端必须已断开连接。由于轮询工作的本质,没有什么好方法可以在所有情况下及时断开轮询。
-
不,可以处理断开连接,在nodejs中你可以注册这个回调:req.on('close',function(){console.log("byby")})。即使 sockjs 里面有 1s 超时或者心跳,我也不希望 apache 给它加 20 秒。
-
@StepanYakovenko 您是否启用了 HTTP 保持活动?
标签: node.js apache socket.io long-polling