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的主要内容,如果未能解决你的问题,请参考以下文章
Firebase 初始化“Node.js 8 已被弃用。” [复制]
如何停止 Python Websocket 客户端“ws.run_forever”