启用 WebSocket 代理必需的模块是 mod_proxy、mod_proxy_http 和 mod_proxy_wstunnel,其中 mod_proxy_wstunnel 专用于处理 Upgrade 协议切换,三者缺一不可,需在 httpd.conf 中取消注释对应 LoadModule 行,并通过 httpd -M 验证状态为 shared。
启用 WebSocket 代理必需的模块
apache 默认不启用 websocket 代理能力,必须手动加载对应模块。除了基础的 mod_proxy 和 mod_proxy_http,关键要启用 mod_proxy_wstunnel——它专用于处理 websocket 的 upgrade 协议切换。
在 httpd.conf 或宝塔等面板的 Apache 配置文件中,确认以下三行已取消注释:
LoadModule proxy_module modules/mod_proxy.soLoadModule proxy_http_module modules/mod_proxy_http.soLoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
Windows 用户可用 httpd -M | findstr proxy,Linux/macOS 用户执行 httpd -M | grep proxy,输出中应同时看到 proxy_module、proxy_http_module 和 proxy_wstunnel_module(状态为 shared)。
配置 WSS 反向代理规则(HTTPS 环境下)
若前端通过 wss://yourdomain.com/wss 连接,后端 WebSocket 服务运行在 ws://127.0.0.1:9501(如 Swoole、Socket.IO),需在虚拟主机的 SSL 配置段内添加:
-
SSLProxyEngine on—— 允许代理 HTTPS/WSS 流量 -
ProxyRequests Off—— 关闭正向代理,仅启用反向代理 ProxyPass /wss ws://127.0.0.1:9501/ProxyPassReverse /wss ws://127.0.0.1:9501/
注意:路径末尾斜杠必须严格一致。写成 /wss 就对应 ws://.../,不能混用 /wss/ 与 ws://.../,否则路径拼接错误导致连接失败。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
处理协议升级与请求头透传
WebSocket 握手依赖 HTTP 的 Upgrade: websocket 和 Connection: upgrade 头。Apache 必须将这些头原样转发给后端:
-
ProxyPreserveHost On—— 保留原始 Host,便于后端日志和路由识别 -
ProxySet keepalive=On—— 启用长连接保持,避免频繁重建 TCP - 显式透传关键头(尤其在 HTTPS 前端 → HTTP 后端场景):
RequestHeader set Origin "https://yourdomain.com" env=REDIRECT_PROXYRequestHeader set X-Forwarded-Proto "https" env=REDIRECT_PROXY
如果后端要求验证 Origin,该设置可确保握手阶段携带合法来源,避免被拒绝。
客户端与服务端配合要点
前端代码应连接代理路径,而非真实后端地址:
- ✅ 正确:
new WebSocket('wss://yourdomain.com/wss') - ❌ 错误:
new WebSocket('wss://yourdomain.com:9501')或ws://...(混合协议被浏览器拦截)
服务端无需开启 CORS(因请求已同源),但需支持标准 WebSocket 握手。例如 Node.js + ws 库中,无需手动设 Access-Control-Allow-Origin;Swoole 启动时指定 SWOOLE_SOCK_TCP|SWOOLE_SSL 并提供 PEM/KEY 即可,证书由 Apache 统一管理,后端只需处理 WS 明文通信。

















