Apache本身不处理WebSocket协议,关键在于VirtualHost中启用mod_proxy_wstunnel模块、ProxyPass使用ws://或wss://前缀、强制透传Upgrade/Connection头、同步设置Timeout和ProxyTimeout为3600。

Apache 本身不处理 WebSocket 协议,VirtualHost 块里配置的关键不是“支持协议”,而是**正确透传 Upgrade 握手并维持隧道连接**。核心在于模块、代理指令、头透传和超时设置四者协同,缺一不可。
必须启用 mod_proxy_wstunnel 模块
这是唯一能识别 Upgrade: websocket 并建立隧道的模块。仅启用 mod_proxy 和 mod_proxy_http 不够,WebSocket 请求会被当作普通 HTTP 处理,导致握手后帧丢失或 1006 错误。
- 检查是否已加载:
httpd -M | grep proxy_wstunnel(Linux/macOS)或httpd -M | findstr wstunnel(Windows) - 未启用需确认
httpd.conf中这三行已取消注释:LoadModule proxy_module modules/mod_proxy.soLoadModule proxy_http_module modules/mod_proxy_http.soLoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so - Debian/Ubuntu 系统可直接运行:
sudo a2enmod proxy proxy_http proxy_wstunnel
ProxyPass 必须用 ws:// 或 wss:// 前缀
协议前缀决定 Apache 走哪条代理路径:用 http:// 就走 HTTP 代理流程,用 ws:// 或 wss:// 才触发 mod_proxy_wstunnel 的隧道逻辑。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 正确写法(路径末尾斜杠必须一致):
ProxyPass /ws/ ws://127.0.0.1:8080/ws/ProxyPassReverse /ws/ ws://127.0.0.1:8080/ws/ - 若前端使用
wss://,VirtualHost 必须配置 SSL(SSLEngine on及证书),否则浏览器会拒绝连接 - WebSocket 代理规则要放在通用规则(如
ProxyPass / http://...)之前,避免被提前匹配拦截
强制透传 Upgrade 和 Connection 头
这两个是 hop-by-hop 头,Apache 默认可能清洗或忽略,导致后端收不到 101 Switching Protocols 响应,握手失败。
- 在 VirtualHost 内添加:
RequestHeader set Connection "upgrade"RequestHeader set Upgrade "websocket" - 禁用可能干扰的模块,例如
mod_security对Upgrade头的拦截规则 - 避免在
<Location>块中重复设置,易引发头复用异常
同步调大 Timeout 和 ProxyTimeout
WebSocket 是长连接,空闲时无数据帧,但连接必须保持。Apache 默认 60 秒超时会主动断开,造成“静默掉线”。
- 在对应
<VirtualHost>块中添加:Timeout 3600ProxyTimeout 3600 - 两个值必须相等且同时设置:前者控制整体请求生命周期,后者控制 socket 级超时
- 不建议全局修改,只在承载 WebSocket 的站点中覆盖
- 若启用 KeepAlive,也建议设为
KeepAliveTimeout 3600保持一致性

















