Nginx如何实现WebSocket协议下的负载均衡连接持久化策略?
- 内容介绍
- 文章标签
- 相关推荐
本文共计895个文字,预计阅读时间需要4分钟。
为了让Nginx正确配置WebSocket和负载均衡,关键不在于开启某个功能,而在于确保连接从握手到持续全程不被中断、不被错分——核心在于连接的保持(session stickiness)。默认轮询请求会将同一客户端的后续请求分发到不同的后端服务器,导致状态丢失、认证失效,甚至消息乱序。
为什么必须做连接保持
WebSocket 是单次握手、长期存活的 TCP 连接,所有后续数据帧都复用该连接。后端服务(如 Swoole、Netty、gowebsocket)通常将用户会话、心跳状态、内存 Session 存在本地,不跨节点共享。若 Nginx 把重连请求或 ping 帧路由到新节点,后端无法识别该连接,直接拒绝或丢弃消息。
- 轮询(round-robin)会导致连接“漂移”,首次连 A,第二次 ping 到 B,B 无上下文 → 断连
- IP 哈希在 CDN 或 NAT 后失效(所有用户 IP 相同)
- 没有连接保持时,哪怕配置了超时和头部,也只解决“断连”问题,不解决“错连”问题
推荐的三种连接保持方式
根据部署环境选择最稳妥的一种:
- ip_hash(简单场景首选):适用于客户端直连 Nginx、无前置代理的内网或可信公网环境。Nginx 对 client IP 做哈希,固定映射到某台后端。配置简洁,无需后端配合。
本文共计895个文字,预计阅读时间需要4分钟。
为了让Nginx正确配置WebSocket和负载均衡,关键不在于开启某个功能,而在于确保连接从握手到持续全程不被中断、不被错分——核心在于连接的保持(session stickiness)。默认轮询请求会将同一客户端的后续请求分发到不同的后端服务器,导致状态丢失、认证失效,甚至消息乱序。
为什么必须做连接保持
WebSocket 是单次握手、长期存活的 TCP 连接,所有后续数据帧都复用该连接。后端服务(如 Swoole、Netty、gowebsocket)通常将用户会话、心跳状态、内存 Session 存在本地,不跨节点共享。若 Nginx 把重连请求或 ping 帧路由到新节点,后端无法识别该连接,直接拒绝或丢弃消息。
- 轮询(round-robin)会导致连接“漂移”,首次连 A,第二次 ping 到 B,B 无上下文 → 断连
- IP 哈希在 CDN 或 NAT 后失效(所有用户 IP 相同)
- 没有连接保持时,哪怕配置了超时和头部,也只解决“断连”问题,不解决“错连”问题
推荐的三种连接保持方式
根据部署环境选择最稳妥的一种:
- ip_hash(简单场景首选):适用于客户端直连 Nginx、无前置代理的内网或可信公网环境。Nginx 对 client IP 做哈希,固定映射到某台后端。配置简洁,无需后端配合。

