Apache代理WebSocket断开主因是自身超时机制,必须同步设置Timeout和ProxyTimeout为3600、启用mod_proxy_wstunnel模块、透传Upgrade/Connection头,并确保路径匹配一致。
apache 代理 websocket 连接时,连接断开绝大多数不是后端问题,而是 apache 自身超时机制主动切断了空闲长连接。关键不是“加心跳”,而是让 apache 别在握手成功后 60 秒就把隧道关掉。
必须同步设置 Timeout 和 ProxyTimeout
这两个值不一致或只设其一,都会导致连接被意外终止:
- Timeout 控制整个请求生命周期(包括 Upgrade 握手阶段)
- ProxyTimeout 控制代理隧道建立后的 socket 级空闲超时
- 两者都必须显式设为相同值,推荐 3600(1 小时),不低于客户端心跳间隔的 2 倍
- 不要全局修改,只在启用 WebSocket 的
<VirtualHost>或<Location>块中覆盖
确保 mod_proxy_wstunnel 已启用且生效
仅启用 mod_proxy 和 mod_proxy_http 不够——它们无法识别 Upgrade: websocket,会把帧当普通 HTTP 处理并丢弃:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 检查模块是否加载:
httpd -M | grep wstunnel - 确认配置中已启用三行:
proxy_module、proxy_http_module、proxy_wstunnel_module - Debian/Ubuntu 可直接运行:
sudo a2enmod proxy proxy_http proxy_wstunnel
透传 Upgrade 和 Connection 头部
这两个是 hop-by-hop 头,默认会被 Apache 清洗,导致浏览器收不到 101 Switching Protocols 响应:
- 在对应虚拟主机或 Location 块中添加:
RequestHeader set Connection "upgrade"RequestHeader set Upgrade "websocket"- 同时确保
mod_headers已启用
禁用干扰行为与缓存
某些默认行为会破坏 WebSocket 隧道语义:
- 关闭代理缓存:
ProxyPass /ws ws://localhost:8080/ disablereuse=off中加上nocache参数,或单独加CacheDisable * - 避免使用
mod_security拦截Upgrade头,必要时在规则中放行 - 路径匹配末尾斜杠必须一致:
ProxyPass "/ws" "ws://localhost:8080/",前后都要有或都无,否则可能重定向失败

















