Node.js "ws" websocket 服务器在约 30 秒后随机断开客户端,错误 1006

Posted

技术标签:

【中文标题】Node.js "ws" websocket 服务器在约 30 秒后随机断开客户端,错误 1006【英文标题】:Node.js "ws" websocket server randomly disconnects client after ~30 seconds, error 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 【参考方案1】:

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

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

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

proxy_read_timeout 86400s;

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

【讨论】:

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

以上是关于Node.js "ws" websocket 服务器在约 30 秒后随机断开客户端,错误 1006的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 node.js“ws”库服务器端监听后续消息

Firebase 初始化“Node.js 8 已被弃用。” [复制]

如何停止 Python Websocket 客户端“ws.run_forever”

Node.js "require" 函数和参数

[Node.js] Use "prestart" in scripts

node.js怎样删除json数据