需确保客户端发送JSESSIONID Cookie且Nginx配置正确:检查请求头、修正Tomcat context.xml、正确定义log_format含"$cookie_JSESSIONID"、在server或location中启用access_log,并可结合upstream hash实现粘性审计。

要在 Nginx 中通过 log_format 记录 $cookie_jsessionid 等 Cookie 变量,用于会话粘性审计,关键不是“开启”某个开关,而是确保请求中确实携带该 Cookie,且 Nginx 配置语法正确、日志上下文合理。
确认客户端实际发送了 jsessionid Cookie
Nginx 只能记录它收到的请求头或 Cookie。如果后端(如 Tomcat)启用了 URL 重写(URL rewriting)而非 Cookie-based session,浏览器可能根本不会发送 JSESSIONID Cookie,导致 $cookie_jsessionid 始终为空。
- 用浏览器开发者工具 → Network 标签,查看任意一个带会话的请求,检查 Request Headers 中是否有
Cookie: JSESSIONID=xxx - 若没有,需在 Tomcat 的
context.xml中设置: - 同时确认应用未禁用 Cookie(例如 Spring Session 配置了
cookie.http-only=false且未强制 header 传输)
正确定义 log_format 并引用 cookie 变量
$cookie_NAME 是 Nginx 内置变量,自动提取请求 Cookie 中名为 NAME 的值(不区分大小写,但建议按实际 Cookie 名大小写书写)。注意拼写必须完全匹配,例如 JSESSIONID 默认首字母大写。
由 ReMe 驱动的记忆管理系统,支持跨会话记忆持久化、自动应用用户偏好以及智能上下文压缩...
- 标准写法(支持空值,无报错):
log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$cookie_JSESSIONID" "$cookie_token"'; - 若 Cookie 名是小写
jsessionid(部分容器或反向代理改写过),则写$cookie_jsessionid - 变量名前后加双引号,避免日志字段被空格截断;空值会记为短横线
-
确保 access_log 在有效作用域启用该 format
定义完 log_format 后,必须在 http、server 或 location 块中显式调用 access_log,并指定格式名。
- 常见错误:只定义了 format,但没在 server 块里写
access_log /var/log/nginx/access.log main; - 若只想审计特定路径(如 /api),可放在 location 块内:
location /api/ { access_log /var/log/nginx/api-session.log main; proxy_pass http://backend; } - 日志路径需保证 Nginx worker 进程有写权限,否则会静默失败
配合 upstream 实现会话粘性 + 审计联动(可选增强)
单纯记录 Cookie 不等于实现粘性,但结合 upstream 的 ip_hash 或 hash $cookie_JSESSIONID,可让同一会话始终打到同一台后端,再通过日志验证是否生效。
- 按 JSESSIONID 做一致性哈希(推荐):
upstream backend { hash $cookie_JSESSIONID consistent; server 10.0.1.10:8080; server 10.0.1.11:8080; } - 此时在日志中观察:相同
$cookie_JSESSIONID是否总对应同一个$upstream_addr?可加该变量到 log_format 辅助验证 - 注意:首次请求无 Cookie 时,hash 值为 0,Nginx 会 fallback 到轮询,属正常行为

















