Apache不原生支持WebSocket,必须启用mod_proxy_wstunnel模块并用ws://前缀配置ProxyPass透传Upgrade请求,同时调高Timeout/ProxyTimeout至3600秒、确保路径斜杠一致、禁用干扰模块,否则101握手后连接秒断。

Apache本身不原生支持WebSocket,必须靠mod_proxy_wstunnel模块显式接管升级请求,否则连接会在101握手后秒断。核心不在“转发路径”,而在“告诉Apache:这不是HTTP,是WebSocket”。
必须启用并验证 proxy_wstunnel 模块
Apache 2.4.5+ 虽已内置该模块,但默认不加载。仅靠mod_proxy和mod_proxy_http无法处理Upgrade: websocket头。
- 运行
apachectl -M | grep proxy_wstunnel,确认输出含proxy_wstunnel_module - 若无输出,在
httpd.conf或mods-enabled/下添加:LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so - 重启前务必执行
apachectl configtest——模块缺失时错误日志只报“Invalid argument”,极易误判
ProxyPass 必须用 ws:// 或 wss:// 协议前缀
写成ProxyPass /ws/ http://backend:8080/ws/是常见致命错误:它会走mod_proxy_http流程,导致后续帧传输异常(如ping无响应、静默断连)。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 正确写法强制指定协议:
ProxyPass /ws/ ws://127.0.0.1:8080/ws/ProxyPassReverse /ws/ ws://127.0.0.1:8080/ws/ - 前后路径末尾斜杠必须严格一致,否则
Sec-WebSocket-Location头重写失败,浏览器直接拒绝连接 - 若前端为
wss://,后端也必须是wss://(或Apache自身终结SSL),混合内容会被现代浏览器拦截
超时设置必须同步延长
WebSocket依赖长连接,而Apache默认Timeout和ProxyTimeout均为60秒。空闲超时后Apache主动断socket,后端无感知,表现就是“连接突然消失”。
- 在对应虚拟主机配置中加入:
Timeout 3600ProxyTimeout 3600 -
Timeout影响整个vhost的请求等待,建议仅在WebSocket专用站点中覆盖,避免全局调高带来DoS风险 -
ProxyTimeout虽标为代理级,但mod_proxy_wstunnel实际依赖底层socket超时,两个值必须同时设且一致
会话保持需用 stickysession=routeid
负载均衡场景下,多个后端节点需确保同一客户端始终打到同一实例,否则WebSocket状态丢失,出现重连或消息乱序。
- 在
ProxyPass后添加参数:ProxyPass /ws/ ws://127.0.0.1:8080/ws/ stickysession=ROUTEID - 要求后端应用在响应中注入
Set-Cookie: ROUTEID=...; Path=/; HttpOnly,Apache据此做路由粘滞 - 注意:不能用
session或JSESSIONID等通用名,避免与其他业务Cookie冲突

















