Apache 通过 mod_proxy_wstunnel 模块支持 WebSocket 负载均衡,需启用该模块、使用 ws:// 或 wss:// 协议前缀、透传 Upgrade 和 Connection 头、调大 ProxyTimeout 并避免健康检查干扰 WebSocket 路径。

Apache 的 mod_proxy_balancer 模块本身不直接处理 WebSocket 协议升级逻辑,但通过合理配置 mod_proxy 和 mod_proxy_wstunnel,可以实现对 WebSocket 长连接的负载均衡支持。
必须启用 mod_proxy_wstunnel 模块
WebSocket 连接建立时会发送 Upgrade: websocket 请求头,普通 HTTP 代理(如 mod_proxy_http)无法透传该协议升级过程。Apache 2.4.5 及以后版本提供了专用模块 mod_proxy_wstunnel,用于代理 WebSocket 的 ws:// 和 wss:// 流量。
- 确认已加载:在配置中包含
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so - 不能用
ProxyPass指向http://后端来代理 WebSocket;必须显式使用ws://或wss://协议前缀 - 例如:
ProxyPass "/ws/" "ws://backend-server/ws/"
负载均衡器需正确转发 Upgrade 和 Connection 头
WebSocket 握手依赖两个关键请求头:Upgrade: websocket 和 Connection: upgrade。默认情况下,mod_proxy 会过滤掉部分 hop-by-hop 头,导致后端收不到升级信号。
- 需显式允许透传:
ProxyPreserveHost On(可选,便于后端日志识别原始 Host) - 强制保留关键头:
RequestHeader set Connection "upgrade"和RequestHeader set Upgrade "websocket" - 禁用代理对响应头的篡改:
ProxyPassReverseCookieDomain和ProxyPassReverseCookiePath根据需要设置,避免 Cookie 路径错乱影响会话
后端节点需保持长连接稳定性
Apache 自身不是 WebSocket 终端,只做隧道式转发。真正的连接生命周期由后端服务(如 Node.js、Spring Boot)管理,因此负载均衡器需避免主动中断空闲连接。
- 调大超时参数:
ProxyTimeout 600(单位秒),防止 Apache 在握手后因 idle 超时断开 - 禁用后端健康检查干扰:若使用
balancer-manager,确保健康检查路径不命中 WebSocket 入口(如避开/ws/) - 建议后端启用 ping/pong 心跳,并在反向代理链路中透传帧(
mod_proxy_wstunnel默认支持)
SSL 终止与 wss 支持
当客户端使用 wss:// 时,Apache 可在前端终止 TLS,再以明文 ws:// 转发给后端,降低后端 SSL 开销。
- 前端配置 HTTPS 虚拟主机,启用 SSL 相关指令(
SSLEngine on等) - 代理规则写为:
ProxyPass "/ws/" "ws://internal-backend/ws/"(注意仍是ws://,非wss://) - 确保后端信任 X-Forwarded-Proto 头,并据此生成正确的重定向或安全标识
不复杂但容易忽略的是头透传和超时设置。只要 mod_proxy_wstunnel 启用、Upgrade/Connection 头不被丢弃、连接不被过早回收,Apache 就能稳定承载 WebSocket 负载均衡流量。










