You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)请求全部正常

调试过程与更新

  1. 尝试社区方案后,开启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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 00:20:31