实现Nginx基于Cookie的高级会话保持需编译启用nginx-sticky-module-ng模块,严格配置cookie名称、domain、path、expires及secure/httponly属性,协同后端统一设置会话Cookie,并叠加健康检查与故障转移机制。要让 upstream 真正实现基于标准 Cookie 的高级会话保持,核心不是简单加一行 `sticky`,而是让 Nginx 主动管理、精准识别、安全传递、容错切换——全程围绕 Cookie 生命周期展开。
nginx-sticky-module-ng 是第三方模块,官方版本不内置。必须在编译阶段显式加入:
nginx-sticky-module-ng(推荐 Bitbucket 官方源)nginx -V 查看原有 configure 参数,全部保留,追加 --add-module=../nginx-sticky-module-ng
make(不要 make install),替换 sbin/nginx 前务必备份原二进制文件nginx -V 2>&1 | grep -o sticky,应输出模块路径Cookie 不是随便起个名、设个过期时间就行,它得和业务路径、安全策略、后端识别逻辑对齐:
JSESSIONID,就写 sticky cookie JSESSIONID ...;WebSocket 场景常用 route 或自定义名如 srv_id
.example.com(开头带点)才能被所有子域名读取;path 设为 / 或应用实际部署路径(如 /app)expires=1h 是常见选择,比浏览器会话周期更可控;太短易断连,太长不利于扩缩容或灰度发布secure httponly,防止 XSS 窃取、明文传输sticky 模块依赖后端返回的原始会话 Cookie(如 JSESSIONID)来建立映射,但很多应用默认返回的 Cookie 缺少 domain/path,导致 Nginx 无法捕获或更新:
conf/context.xml 中补充:<Context sessionCookiePath="/" sessionCookieDomain=".example.com" />
server.servlet.session.cookie.path=/ 和 server.servlet.session.cookie.domain=.example.com
sticky 默认“认 Cookie 不认健康”,节点宕机后用户仍持续打过去,直接 502。必须叠加主动探测机制:
nginx_upstream_check_module 启用 TCP 或 HTTP 健康检查,设 fall=3 rise=2 动态标记 down
no_fallback —— 它会让故障节点直接返回错误,而非重试其他节点max_fails=3 fail_timeout=30s,让 Nginx 自动临时屏蔽异常节点(与健康检查配合效果更稳)down,Nginx 会跳过该节点