nginx通过hash $cookie_jsessionid consistent;可实现基于jsessionid的会话保持,但需满足客户端携带jsessionid cookie、upstream中正确配置大小写匹配的变量名、禁用ip_hash、并建议组合$remote_addr兜底及启用健康检查等前提条件。

直接用 hash $cookie_jsessionid consistent; 就能实现基于 Java 应用 Session ID 的连接保持,但必须满足几个前提条件,否则会失效或 fallback 到轮询。
确保客户端真正携带 JSESSIONID Cookie
Ngins 只能读取它收到的 Cookie。如果浏览器没发 JSESSIONID,这个变量永远为空:
- 打开浏览器开发者工具 → Network → 点一个带登录态的请求 → 查看 Request Headers 中是否有
Cookie: JSESSIONID=xxx - 若没有,常见原因是 Tomcat 启用了 URL 重写(默认行为),需在
context.xml中显式开启 Cookie:cookies="true" sessionCookiePath="/" useHttpOnly="false" /> - Spring Boot 用户检查是否禁用了 Cookie:确认
server.servlet.session.cookie.http-only=false,且未强制通过 Header 传 session
正确配置 upstream 块
不能混用 ip_hash,必须用通用 hash 指令,并启用 consistent:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 基础写法(支持权重):
upstream backend {<br> hash $cookie_JSESSIONID consistent;<br> server 192.168.1.10:8080 weight=3;<br> server 192.168.1.11:8080 weight=1;<br>} - 变量名大小写要匹配实际 Cookie 名——Tomcat 默认发的是
JSESSIONID(大写),所以写$cookie_JSESSIONID;若应用改成了小写jsessionid,就写$cookie_jsessionid - 首次请求可能无 Cookie,Nginx 默认 fallback 到加权轮询;如需更稳,可组合兜底键:
hash "$cookie_JSESSIONID:$remote_addr" consistent;
处理代理和真实 IP 场景
如果 Nginx 前面还有 CDN、WAF 或其他反向代理,$remote_addr 是代理 IP,但 $cookie_JSESSIONID 不受影响,所以这一步对 Cookie 方案影响较小。不过仍建议:
- 确认代理已透传 Cookie(即未过滤或重写
JSESSIONID) - 若代理做了 Cookie 改写(例如加前缀、base64 编码),需在 Nginx 里用
map提前解析,再哈希 - 日志中验证是否生效:定义含
"$cookie_JSESSIONID"的log_format,查看 access log 中该字段是否稳定出现且非短横线
配套增强可用性
光有哈希不够,还要让粘性真正可靠:
- 节点数建议 ≥3 台,避免一致性哈希在节点少时分布不均
- 配健康检查:
max_fails=2 fail_timeout=30s,防止故障节点持续接收粘性流量 - 若后端重启或 Session 过期,用户会自然获得新
JSESSIONID,Nginx 自动重新哈希路由,无需人工干预










