Apache支持WebSocket的关键是启用mod_proxy_wstunnel模块、ProxyPass使用ws://或wss://前缀、透传Upgrade/Connection头、同步设置Timeout和ProxyTimeout为3600,并确保规则顺序正确。

Apache 本身不处理 WebSocket 协议,支持 WebSocket 握手的关键不是 ServerName 或普通代理配置,而是启用专用模块、使用正确协议前缀、透传关键请求头,并匹配超时设置。所有操作都集中在 `httpd.conf`(或对应虚拟主机配置块)中完成。
必须启用 mod_proxy_wstunnel 模块
这是唯一能识别 Upgrade: websocket 并建立隧道的模块。缺它,Apache 会把 WebSocket 请求当作普通 HTTP 处理,握手后帧全部丢失。
- 检查是否已加载:
httpd -M | grep proxy_wstunnel(Linux/macOS)或httpd -M | findstr wstunnel(Windows),应看到proxy_wstunnel_module (shared) - 若未启用,在
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
- 保存后重启 Apache:
sudo systemctl restart apache2(Debian/Ubuntu)或sudo apachectl restart(macOS/源码安装)
ProxyPass 必须用 ws:// 或 wss:// 前缀
仅当 ProxyPass 目标以 ws:// 或 wss:// 开头时,mod_proxy_wstunnel 才会激活隧道模式。写成 http:// 看似能握手,实则后续帧被静默丢弃。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 明文示例(前端访问
/ws/,后端监听127.0.0.1:8080/ws/):ProxyPass /ws/ ws://127.0.0.1:8080/ws/ProxyPassReverse /ws/ ws://127.0.0.1:8080/ws/ - 加密示例(需 Apache 自己终结 HTTPS):
ProxyPass /ws/ wss://127.0.0.1:8443/ws/ProxyPassReverse /ws/ wss://127.0.0.1:8443/ws/ - 路径末尾斜杠必须严格一致:前后都带
/,否则Sec-WebSocket-Location重写错误,现代浏览器直接拒绝连接
强制透传 Upgrade 和 Connection 头
WebSocket 握手依赖这两个 HTTP 头,Apache 默认可能修改或删除它们,需显式保留:
- 在同一个
<VirtualHost>块内添加:ProxyPreserveHost OnRequestHeader set Connection "upgrade"RequestHeader set Upgrade "websocket" - 确保
mod_headers已启用(检查httpd -M | grep headers) - 避免其他模块(如
mod_deflate)对 WebSocket 路径启用压缩——WebSocket 帧不压缩,且压缩会破坏二进制流
同步设置 Timeout 和 ProxyTimeout
WebSocket 是长连接,空闲时无数据帧,但连接必须维持。Apache 默认 60 秒超时会导致握手成功后几秒就断开。
- 在
<VirtualHost>内添加(不建议全局改):Timeout 3600ProxyTimeout 3600 - 如果还启用了 KeepAlive,也建议设为:
KeepAliveTimeout 3600 - 三个值保持一致且 ≥ 3600 秒,否则仍可能静默掉线

















