Apache本身不处理WebSocket,仅透传Upgrade请求;必须启用mod_proxy、mod_proxy_http和mod_proxy_wstunnel模块,ProxyPass须用ws://或wss://前缀并严格匹配路径末尾斜杠,配置ProxySet upgrade=websocket、KeepAlive On及足够超时,确保Upgrade/Connection头透传。

Apache 本身不处理 WebSocket,只负责把 Upgrade 请求原样透传给后端。关键不是让它“支持”WebSocket,而是确保代理链不破坏协议升级过程。
必须启用的模块
Apache ≥2.4.5 才有完整支持,缺一不可:
- mod_proxy:代理基础功能
- mod_proxy_http:HTTP 协议转发必需
- mod_proxy_wstunnel:专用于 WebSocket 的隧道代理,不能省略
Debian/Ubuntu 系统可直接运行:a2enmod proxy proxy_http proxy_wstunnel;CentOS/RHEL 需检查 httpd.conf 中对应 LoadModule 行是否取消注释。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
ProxyPass 路径配置要精准
普通 HTTP 转发用 ProxyPass /api/ http://backend:8080/api/ 就行,但 WebSocket 必须显式声明协议类型和路径结尾斜杠:
- 目标地址协议必须是
ws://或wss://(不能写成http://) - 源路径和目标路径末尾都带
/,例如:ProxyPass "/ws/" "ws://127.0.0.1:8080/ws/" - 同时配
ProxyPassReverse "/ws/" "ws://127.0.0.1:8080/ws/",避免重定向出错
连接与头信息不能丢
WebSocket 依赖 Upgrade 头协商,Apache 默认可能过滤或改写关键字段:
- 加
ProxySet upgrade=websocket显式启用升级识别 - 确保
KeepAlive On,并调大超时:ProxySet keepalive=on connectiontimeout=5 timeout=60 - 转发原始 Host 和协议:
ProxyPreserveHost On,再加RequestHeader set X-Forwarded-Proto "https"(HTTPS 场景)
验证是否生效
别只看页面能不能打开,重点查底层行为:
- 浏览器开发者工具 Network 标签中,WebSocket 连接状态码应为 101 Switching Protocols
- 后端日志里应出现正常握手,而非降级为轮询或报 400/502
- 用
curl -i -H "Upgrade: websocket" -H "Connection: Upgrade" http://yourdomain.com/ws/检查响应头是否含Upgrade: websocket和Connection: Upgrade

















