Express+HPM代理PVE WebSocket遇404及请求重复问题求助
Express + http-proxy-middleware代理PVE WebSocket控制台30秒后404故障求助
问题概述
基于Express和http-proxy-middleware(HPM v2)封装了ws-proxy工具,用于代理所有请求至目标站点,其中包含通过安全WebSocket提供xterm.js/NoVNC控制台功能的PVE节点。
异常表现:
- 服务启动后30秒内,WebSocket控制台连接可正常建立并维持;
- 30秒后的WebSocket连接请求会被
404 Not Found中断; - HPM日志输出:
[HPM] Upgrading to WebSocket [HPM] Upgrading to WebSocket(有时多达4次) [HPM] Client disconnected
- 浏览器返回404,使用websocat测试报错:
websocat: WebSocketError: Received unexpected status code (404 Not Found) websocat: error running
- 调试发现请求栈中某组件先返回404并关闭连接,后续PVE才返回
101 Switching Protocols,偶发write after end或socket hangup错误。
环境与链路信息
- Node.js v16,http-proxy-middleware v2
- 请求链路:Cloudflare → DigitalOcean(SSH转发,已排除该环节问题)→ ws-proxy → 目标服务器
- 非WebSocket(HTTP)请求全部正常
调试过程与更新
- 尝试社区方案后,开启
logLevel: debug发现请求被重复发送,日志中出现两条完全相同的GET请求。当前使用的upgrade事件监听代码:
httpsServer.on('upgrade', (req, socket, head) => { if (!req.headers.host) { console.log('No vhost specified in upgrade request. Ignoring.'); socket.end(); return; } else { console.log(`Upgrade request for vhost ${req.headers.host}, proxy out`); vhostProxyMiddlewareList[req.headers.host].upgrade(req, socket, head); } })
重启服务后短时间内无重复请求,但后续仍会复现。
2. 曾怀疑vhost模块通配符配置导致请求被发送至两个目标节点,已验证排除该可能性。
3. 确认请求重复是由于某组件隐式调用了next(),而非vhost模块问题。
4. 多次调整配置后问题仍未解决,未收到HPM官方相关issue的回复,现寻求技术支持。
内容的提问来源于stack exchange,提问作者0xLogN
相关产品推荐
相关产品推荐

