【问题标题】:Node.js "ws" websocket server randomly disconnects client after ~30 seconds, error 1006Node.js "ws" websocket 服务器在约 30 秒后随机断开客户端,错误 1006
【发布时间】:2018-04-03 12:26:05
【问题描述】:

我有一个像这样的简单 websocket 服务器:

const WebSocket = require('ws');
const wss = new WebSocket.Server( { server: server, path: "/ws" });

wss.on('connection', function connection(ws, req) {

    console.log("Connected");
    ws.on('message', function incoming(message) {
        console.log('received: %s', message);
    });

    ws.on('close', function close(code, reason) {
        console.log("Code: "+code+" | Reason: "+reason);
        console.log('disconnected');
    });

    ws.send('something');
});

我有一个可以正常连接的客户端,但是在连接大约 30 秒后,websocket 服务器关闭连接,错误代码为“1006”。谷歌告诉我这意味着连接异常中断。但是,我不确定是什么原因造成的。 ws.on('error') 回调也不会被触发。如何与我的客户保持无限期/更长的连接?

【问题讨论】:

  • 我有一种强烈的感觉,这不是随机的。您是否使用反向代理或其他东西(例如 nginx)?
  • 嗨,是的,我正在使用 nginx。nginx 可能会导致这种情况吗?我之前按照本指南启用了适当的标头以允许 websocket 访问:nginx.com/blog/websocket-nginx

标签: javascript node.js sockets networking websocket


【解决方案1】:

Nginx 将 30 秒设置为默认超时。

您需要使用proxy_read_timeout 指令增加此数字。

例如,将超时时间延长到一天(这可能是矫枉过正)

proxy_read_timeout 86400s;

通常我在location 部分设置它,这样它就可以仅针对 websocket 被覆盖,而不会影响可能需要默认设置的区域。

【讨论】:

  • 好像是这个!我现在有持续的连接。你能解释一下该指令的目的是什么吗?
  • 基本上是为了让 nginx 在转发挂起的连接时不会卡住。假设您有一个行为不端的网络服务器,它只是保持连接打开,因为它由于某种原因冻结了。 Nginx 最终会耗尽资源来处理新请求。基本上是为了防止这种情况。请记住,这一切都是在 websockets 甚至长轮询成为所需功能之前决定的。
猜你喜欢
  • 2018-08-23
  • 2015-04-04
  • 2016-06-28
  • 2016-05-21
  • 2015-04-17
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多