Nginx集群会话保持有四种方式:①ip_hash绑定客户端IP,适用于内网固定IP;②cookie哈希(hash $cookie_JSESSIONID consistent)实现软粘性,抗NAT;③sticky cookie自动注入路由标识,需编译第三方模块;④配合Redis实现分布式Session,推荐中大型业务。

在 Nginx 集群中实现会话保持,核心是让同一用户请求持续落到同一台后端服务器,或确保各后端能读写同一份会话数据。配置方式取决于你的网络环境、后端能力与运维条件,不能只套用一种写法。
用 ip_hash 绑定客户端 IP(适合内网固定 IP 场景)
这是最轻量、无需额外模块的原生方案,适用于企业内网、测试环境等客户端 IP 稳定的场景:
- 在 upstream 块第一行直接写 ip_hash;,不能缩进,也不能和其它 hash 指令共存
- upstream 至少定义两台后端 server,且不能带 weight、backup、down 等参数,否则 Nginx 启动失败
- IPv4 默认只取前 3 段哈希(如 192.168.1.10 和 192.168.1.20 视为同一 IP),NAT 环境下易导致单台过载
- 若前端有 CDN、WAF 或代理,需启用 real_ip_module 还原真实 IP:
– 在 http 块中声明可信段:set_real_ip_from 10.0.0.0/8;
– 在 location 中透传:proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
用 cookie 哈希实现软粘性(免编译、抗 NAT)
当用户来自公网、手机频繁切换网络或存在多层代理时,推荐用已有的业务 Cookie(如 JSESSIONID)做一致性哈希:
- 配置示例:hash $cookie_JSESSIONID consistent;(放在 upstream 内)
- 首次请求无该 Cookie 时走轮询;后续带 Cookie 的请求才被哈希绑定,天然支持会话建立过程
- 要求后端应用正常生成并返回标准会话 Cookie(如 Tomcat 默认的 JSESSIONID)
- consistent 参数可减少后端增减节点时的会话漂移,比普通 hash 更稳定
用 sticky cookie 自动注入路由标识(无需后端改造)
若无法修改后端代码,又希望强会话绑定,可使用 nginx-sticky-module-ng 模块:
- 配置示例:sticky cookie srv_id expires=1h domain=.example.com path=/;
- 模块会在首次响应中自动 set-cookie,值为内部计算的唯一路由 ID;后续请求自动识别并转发
- domain 和 path 必须与业务域名匹配,否则浏览器不携带该 cookie
- 需提前编译安装该第三方模块,主流云主机平台(如新网云)已预集成
配合 Redis 实现真正分布式 Session(推荐中大型业务)
Nginx 本身不管理 session,但可作为反向代理配合后端统一存储:
- PHP:配置 session.save_handler = redis,指定 redis host/port
- Java(Spring Boot):引入 spring-session-data-redis,自动接管 HttpSession
- Node.js:用 express-session + connect-redis 中间件
- Nginx upstream 可回归轮询或 least_conn,不再依赖粘性策略,扩容缩容无感知


















