nginx集群会话保持需在upstream块中配置策略:ip_hash(基于客户端ip)、hash $cookie_jsessionid consistent(基于会话cookie)、sticky cookie(nginx主动下发路由标识),server块仅负责代理转发并正确设置proxy_set_header等参数。

在 Nginx 中实现集群环境下的会话保持路由,关键不是靠 server 块单独完成,而是通过 upstream 块定义带会话策略的后端集群,并在 server 块中用 proxy_pass 指向它。server 块本身只负责接收请求、匹配路径和发起代理,真正的路由绑定逻辑在 upstream 里。
用 ip_hash 绑定客户端 IP(适合内网或 IP 稳定场景)
这是最轻量、无需额外模块的方式,在 upstream 中启用即可:
- 在 http 块内定义 upstream,开头加
ip_hash;,后面列出后端地址 - 注意:不能同时配置
weight、backup或down,否则 Nginx 启动会报错 - 若前端有 CDN、WAF 或代理,
$remote_addr是上一跳地址,需配合set_real_ip_from和X-Forwarded-For头还原真实 IP
示例:
upstream app_cluster {ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
用 cookie 哈希实现更稳定的绑定(推荐公网用户)
避免因移动网络切换、NAT 共享等导致 IP 变化而丢失会话,直接基于应用已有的会话 Cookie(如 JSESSIONID)做哈希:
- 在 upstream 内使用
hash $cookie_JSESSIONID consistent; - 首次请求无该 Cookie 时走轮询;后续携带 Cookie 的请求自动固定到同一台后端
- 不依赖 IP,也不需要改后端代码,只要后端正常生成标准会话 Cookie 即可
示例:
upstream app_cluster {hash $cookie_JSESSIONID consistent;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
用 sticky cookie 由 Nginx 主动下发路由标识(兼容老旧系统)
当后端无法统一存储 Session,又希望绕过 IP 不稳定问题时,让 Nginx 自己生成并维护一个路由 Cookie:
- 使用官方商业版的
sticky cookie指令(开源版需编译第三方模块,如 nginx-sticky-module) - 配置形如
sticky cookie srv_id expires=1h domain=.example.com path=/; - Nginx 第一次请求时写入该 Cookie,之后凭此识别并转发到对应后端,整个过程对后端透明
server 块中必须配好的代理头和转发规则
无论选哪种 upstream 策略,server 块中的反向代理配置都要正确,否则后端拿不到真实信息,会话逻辑可能失效:
-
proxy_pass http://app_cluster;—— 注意末尾不加斜杠,否则路径会被重写 - 必须设置:
proxy_set_header Host $host;、proxy_set_header X-Real-IP $remote_addr;、proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - 建议加上超时控制:
proxy_connect_timeout 5s;、proxy_read_timeout 30s;、proxy_send_timeout 30s;











