You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
客户端:Windows 11 + Edge(Chromium 146);同时在无任何扩展的 Electron 内嵌浏览器中同样复现
浏览器与 dsh 之间有透明代理(TUN)与 Docker 端口转发
症状
页面静态资源、普通 RPC 基本正常,但 events.mux(有时 events.host 一起)WebSocket 全部失败,控制台无限刷: WebSocket connection to 'ws://…/api/events.mux' failed: WebSocket is closed before the connection is established.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
环境
0.1.0-rc.6(npm 发行版),Docker 部署(node:24-slim)0.0.0.0,已配置--trusted-host症状
events.mux(有时events.host一起)WebSocket 全部失败,控制台无限刷:WebSocket connection to 'ws://…/api/events.mux' failed: WebSocket is closed before the connection is established.[web-runtime] connection lost, retry #N无限重试,工作区列表永远「正在加载工作区…」与 #313 不同,这不是 /api 403 / 信任围栏问题:same-origin、trusted-host 配置正确、没有任何 403 响应,且在无扩展的浏览器同样复现。
根因
Node
http默认keepAliveTimeout = 5s:空闲 keep-alive 连接 5 秒后被 dsh 关闭,但这个 FIN 经过代理/NAT/端口转发层时经常丢失,浏览器认为连接仍存活并继续复用:netstat可见大量 TIME_WAIT 与长期 ESTABLISHED 的僵尸连接字节级 TCP 中继(127.0.0.1)抓包实锤:升级请求 1ms 发出、服务端 3ms 返回(101/403)、4ms 送达浏览器并正常关闭——但页面 WebSocket 事件一个都不触发:响应已到浏览器,连接已坏不派发。
修复与验证
给 dsh 的 http server 显式设置更大的
keepAliveTimeout(monkey-patchhttp.Server.prototype.listen设为 600s 验证)后,完全重启浏览器清掉被污染的连接池,一切恢复正常、连续使用不再复发。建议
dsh-host-webserver显式设置server.keepAliveTimeout(≥65s,比常见反向代理与浏览器连接池更久)或提供配置项。Node 默认 5s 面向直连场景,任何「浏览器与 dsh 之间有代理/NAT/端口转发」的部署都可能踩中(反向代理、TUN、docker 端口映射)。All reactions