怎么配置Apache负载均衡以支持长连接集群共享

作者:袖梨 2026-07-14
Apache不直接共享长连接,而是通过stickysession实现会话粘滞,确保同一用户始终路由至同一后端节点;同时需后端(如Redis或Tomcat集群)同步用户上下文、登录态等状态,以保障长连接业务连续性。

Apache 本身不直接“共享”长连接,而是通过会话粘滞(sticky session)+ 后端应用层状态同步来保障长连接场景下的业务连续性。真正需要集群共享的不是 TCP 连接本身,而是连接背后的状态——比如 WebSocket 的用户上下文、登录态、消息队列归属等。配置关键在于:让同一用户的请求始终落到同一后端节点(粘滞),同时确保该节点宕机时,状态能被其他节点接管(靠 Tomcat 复制或 Redis 存储)。

启用 mod_proxy_balancer 并开启 sticky session

这是 Apache 层实现长连接路由一致性的基础:

  • 确认已启用必要模块:proxyproxy_httpproxy_balancerproxy_connect
  • 在虚拟主机中配置负载均衡器,并显式指定 stickysession=JSESSIONID|jsessionid(Java 应用)或 stickysession=ROUTEID(WebSocket 场景)
  • 每个 BalancerMember 必须带 route=xxx 参数,且值需与后端服务(如 Tomcat 的 jvmRoute 或 WebSocket 服务标识)严格一致

为 WebSocket 长连接专项优化

普通 HTTP 负载均衡不能直接用于 WebSocket,必须走专用隧道模块:

  • 加载 mod_proxy_wstunnel(Apache 2.4.5+ 内置,检查 httpd -M | grep wstunnel
  • ProxyPass 指令必须使用 ws://wss:// 协议前缀,不能用 http://
  • 路径末尾斜杠需统一,例如 ProxyPass /ws/ ws://127.0.0.1:8080/ws/,否则 Sec-WebSocket-Location 重写失败
  • 设置 Timeout 3600ProxyTimeout 3600,避免空闲连接被 Apache 主动断开

后端状态共享不能依赖 Apache

Apache 不管理 session 数据,共享逻辑必须由后端实现:

  • 若用 Tomcat:在 web.xml<distributable/>server.xml<Cluster>,并启用 BackupManagerDeltaManager
  • 若用 Spring Boot + WebSocket:推荐将用户连接元数据(如 userId ↔ sessionId ↔ node)存入 Redis,各节点启动时订阅变更,实现连接状态可迁移
  • 禁用 Apache 的 KeepAlive(设为 off 或极短时间),让前端负载均衡器(如 Nginx)负责连接复用,Apache 专注快速转发

验证是否真正生效

不要只看请求是否分发成功,要验证状态是否可延续:

  • 打开浏览器开发者工具,观察 WebSocket 连接 URL 中的 jsessionid 是否携带 route 参数(如 node1
  • 刷新页面或重连,检查 Sec-WebSocket-Accept 响应头是否稳定,且后端日志显示始终由同一实例处理
  • 手动停掉当前 route 对应的后端服务,观察客户端是否自动重连并恢复会话(需后端配合 session 复制或外部存储)

相关文章

精彩推荐