Apache 不处理 WebSocket 协议,仅透传握手和帧;需启用 mod_proxy、mod_proxy_http、mod_proxy_wstunnel 等模块,正确配置 ProxyPass 路由(如 ws://)、透传 Upgrade/Connection 头、调优超时与 KeepAlive,并使用 event MPM 及负载均衡粘滞策略。

必须启用并正确组合代理模块
缺一不可,否则 mod_proxy_wstunnel 不生效:
- mod_proxy:基础代理框架
- mod_proxy_http:虽不用于 WebSocket 流量,但部分指令(如 ProxyPreserveHost)依赖它
-
mod_proxy_wstunnel:唯一能识别
ws://和wss://并透传 Upgrade 的模块 - mod_proxy_balancer + mod_lbmethod_byrequests(或其他调度算法):实现负载分发
检查是否已加载:apachectl -M | grep -E 'proxy|balancer|lbmethod',输出中应含 proxy_wstunnel_module。
WebSocket 路由必须前置且协议前缀明确
ProxyPass 规则顺序和写法决定走哪个模块:
- ❌ 错误写法:
ProxyPass /ws/ http://backend:8080/ws/→ 走 HTTP 代理,握手成功但后续帧乱序或静默断开 - ✅ 正确写法:
ProxyPass /ws/ ws://127.0.0.1:8080/ws/ keepalive=On - 路径末尾斜杠必须严格一致(
/ws/对/ws/),否则 Sec-WebSocket-Location 头重写异常,浏览器拒绝连接 - 该规则必须写在通用代理(如
ProxyPass / http://...)之前,否则被提前匹配截断
透传 Upgrade 和 Connection 头,禁用 hop-by-hop 过滤
WebSocket 握手依赖两个关键请求头:Upgrade: websocket 和 Connection: upgrade。默认情况下,mod_proxy 会丢弃这些 hop-by-hop 头:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 显式恢复:
RequestHeader set Connection "upgrade" - 显式恢复:
RequestHeader set Upgrade "websocket" - 加上
ProxyPreserveHost On,便于后端日志识别原始 Host - 避免使用
ProxySet keepalive=Off或其他干扰连接复用的设置
超时与连接稳定性调优
默认 60 秒超时对长连接是致命的。需同步调整多层超时:
-
Timeout 3600:全局请求等待上限(建议仅在 WebSocket 专用 vhost 中覆盖) -
ProxyTimeout 3600:代理级 socket 空闲超时,mod_proxy_wstunnel 实际依赖此值 -
KeepAlive On且KeepAliveTimeout 300:设为后端心跳间隔的 2–3 倍(如后端每 30 秒 ping,则设 90–150 秒) -
MaxKeepAliveRequests 0:不限制单连接请求数,防止频繁重建连接 - MPM 必须用
event模式(非 prefork):prefork 下每个连接占一个进程,千级连接直接内存耗尽
负载均衡组配置示例(带粘滞与健康隔离)
WebSocket 连接一旦建立,就应尽量固定到同一后端节点(除非故障转移):
- 定义 WebSocket 专用 balancer:
<Proxy balancer://wscluster> - 成员地址必须用
ws://:BalancerMember ws://192.168.1.10:8080 route=ws1 - 启用会话粘滞:
ProxyPass /ws/ balancer://wscluster/ws/ stickysession=ROUTEID - 禁用健康检查干扰:
ProxySet lbmethod=byrequests,并确保 balancer-manager 的健康探测路径不命中/ws/
后端服务自身必须响应 ping 帧(Node.js ws 库默认支持;Spring Boot 需注册 PongMessageHandler;Go gorilla/websocket 需调用 conn.SetPingHandler() 并保持读循环运行)。

















