Apache 正确代理 WebSocket 必须启用 mod_proxy_wstunnel(核心)、mod_ssl(wss 场景)和 mod_headers(透传 Upgrade/Connection 头),ProxyPass 目标地址须严格使用 ws:// 或 wss:// 前缀,否则触发 1006 错误。
apache 要正确转发 websocket(ws:// 或 wss://)连接,不能只靠基础代理模块,必须启用专用模块并严格匹配协议前缀和请求头。否则客户端会收到 1006 错误,连接被静默断开。
必须启用的模块
仅启用 mod_proxy 和 mod_proxy_http 是不够的。WebSocket 是基于 HTTP 升级(Upgrade: websocket)的独立协议,需额外加载:
-
mod_proxy_wstunnel—— 核心模块,负责透传升级后的 WebSocket 连接帧 -
mod_ssl—— 若前端是wss://(HTTPS),必须启用以处理 TLS 终结或上游 wss 通信 -
mod_headers(可选但推荐)—— 用于显式设置Connection: upgrade和Upgrade: websocket头,避免被中间层过滤
VirtualHost 中的 ProxyPass 必须用 ws:// 或 wss:// 协议前缀
这是最容易忽略的关键点:ProxyPass 目标地址必须明确写成 ws:// 或 wss://,而不是 http://。Apache 会据此启用 mod_proxy_wstunnel 的处理逻辑。
示例(HTTP 端口):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<VirtualHost *:80> ServerName app.example.com ProxyPreserveHost On ProxyRequests Off <h1>✅ 正确:使用 ws:// 前缀,触发 wstunnel 模块</h1><p>ProxyPass /ws/ ws://127.0.0.1:8080/ws/ ProxyPassReverse /ws/ ws://127.0.0.1:8080/ws/</p><h1>❌ 错误:用 http:// 会导致 1006</h1><h1>ProxyPass /ws/ <a href="https://www.php.cn/link/21e65c491e54a6bb779104afc0f5935a">https://www.php.cn/link/21e65c491e54a6bb779104afc0f5935a</a></h1><p></VirtualHost>
HTTPS 场景下 wss 代理配置要点
当用户访问 wss://app.example.com/ws/,Apache 需做 TLS 终结,并将解密后的 WebSocket 升级请求转给后端 ws:// 服务:
- SSL 证书必须已配置在
<VirtualHost *:443>中 - 目标地址仍用
ws://(不是wss://),除非后端自己也启用了 TLS - 建议添加头透传,确保升级流程不被拦截:
RequestHeader set Upgrade "websocket" RequestHeader set Connection "upgrade"
验证与调试建议
配置完成后重启 Apache,并检查:
- 运行
httpd -M | grep proxy,确认输出含proxy_wstunnel_module (shared) - 开启日志辅助排查:
LogLevel info proxy:trace5 - 用浏览器开发者工具查看 WebSocket 连接的 Network → WS → Headers,确认
Sec-WebSocket-Accept返回成功,无 502/503

















