使用 hash $cookie_sessionid consistent 可实现比 ip_hash 更精准的会话保持,前提是客户端携带且 nginx 能正确读取匹配的 cookie(如 jsessionid 或 sessionid),需确保大小写一致、代理透传、应用未禁用 cookie,并可组合 $remote_addr 兜底。

直接用 hash $cookie_sessionid consistent; 就能实现比 ip_hash 更精准的会话保持,前提是客户端真正携带了 sessionid 这个 Cookie,且 Nginx 能正确读取、哈希并稳定分发。
确保 Cookie 名称与实际一致
变量名必须严格匹配浏览器发送的 Cookie 名:
- Tomcat 默认发的是
JSESSIONID(全大写),应写$cookie_JSESSIONID - Spring Boot 若自定义为小写
sessionid,就得写$cookie_sessionid - 大小写不匹配会导致变量为空,Nginx 自动 fallback 到加权轮询
验证客户端是否真带了这个 Cookie
打开浏览器开发者工具 → Network → 点一个已登录的请求 → 查看 Request Headers 中的 Cookie: 行:
创建全面的交接文档,使新AI代理能够无缝继续工作,消除歧义。解决上下文耗尽问题。 时机:(1)用户请求保存交接,(2)上下文即将满,(3)主要任务完成,(4)会话结束,(5)恢复工作时。 关键词:保存状态、创建交接、上下文已满、暂停、从...恢复、加载交接、保存进度、会话转移、交接
- 若没出现类似
sessionid=abc123或JSESSIONID=xyz789,说明应用没发,或被中间代理过滤/改写 - 常见原因:Tomcat 关闭了 Cookie(
<context cookies="false"></context>)、Spring Boot 配置了server.servlet.session.tracking-modes=none或强制用 URL 传参
正确配置 upstream 块
不能和 ip_hash 共存,也不能在 hash 指令前加缩进:
- 基础写法(支持权重):
upstream backend {
hash $cookie_sessionid consistent;
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=1;
} - 首次请求无 Cookie 时,Nginx 默认走轮询;如需更稳,可组合兜底键:
hash "$cookie_sessionid:$remote_addr" consistent;
应对代理或 CDN 场景
只要 Cookie 被透传过来,$cookie_sessionid 就不受影响:
- 确认上游代理未过滤、重命名或 base64 编码 JSESSIONID/sessionid
- 若代理做了改写(例如加前缀
lb_sessionid=xxx),需先用map提取原始值再哈希 - 无需像 ip_hash 那样依赖真实 IP,天然抗 NAT、移动网络切换、内网共享出口等干扰










