在upstream块中启用sticky cookie并合理配置作用域与容错策略,是实现稳定会话粘滞的关键;需编译安装nginx-sticky-module-ng模块,配置cookie名、有效期、域名路径及secure/httponly属性,并结合健康检查与failover机制保障高可用。

直接在 upstream 块中启用 sticky cookie,并合理设置作用域与容错策略,是实现稳定会话粘滞的关键。它比 ip_hash 更精准,也比纯内存 Session 更可控。
确保模块已正确编译安装
sticky 是第三方模块,Nginx 官方不内置。必须在编译阶段显式加入:
- 下载适配当前 Nginx 版本的
nginx-sticky-module-ng(推荐 Bitbucket 源,兼容 1.25+) - 用
nginx -V查看原有 configure 参数,原参数必须全部保留,再追加--add-module=../nginx-sticky-module-ng - 执行
make(不要make install),替换sbin/nginx二进制文件前先备份 - 验证是否生效:
nginx -V 2>&1 | grep -o sticky应输出模块路径
在 upstream 中配置 Cookie 粘滞规则
核心是让 Nginx 主动下发可识别、可持久、范围可控的 Cookie:
- 写法示例:
sticky cookie srv_id expires=1h domain=.example.com path=/ secure httponly; -
srv_id是客户端收到的 Cookie 名,值由 Nginx 自动生成(默认为 server 地址哈希),也可用hash=md5提升一致性 -
expires=1h显式设有效期,避免依赖浏览器会话周期;过短易失效,过长不利于节点扩缩容 -
domain=.example.com支持子域名共享(注意开头的点),path=/确保全站生效 -
secure httponly必须加上——前者强制仅 HTTPS 传输,后者防 XSS 窃取 Cookie(需 Nginx ≥1.19.3)
处理后端故障时的请求流向
sticky 默认“认 Cookie 不认健康”,节点宕机后用户仍持续打过去,造成 502。需主动干预:
- 在
server行后加down标记已下线节点,Nginx 会跳过它(但不自动发现) - 搭配
nginx_upstream_check_module做主动健康检查,配合fall=3 rise=2动态标记down - 避免使用
no_fallback——它会让故障节点直接返回 502,用户体验更差 - 可考虑加
max_fails=3 fail_timeout=30s让 Nginx 自动临时屏蔽异常节点
验证与日常观测要点
配置生效 ≠ 粘滞稳定,需从客户端和服务器两端交叉确认:
- 用浏览器开发者工具 → Network → 查响应头是否有
Set-Cookie: srv_id=xxx,且Secure和HttpOnly属性存在 - 刷新页面,观察后续请求的
Cookie请求头是否携带该值,并比对后端 access_log 中的 $remote_addr 和 $upstream_addr - 手动停掉某台后端,观察用户是否在几秒内自动切到其他节点(依赖健康检查配置)
- 日志中若频繁出现
no live upstreams或upstream timed out,说明 fallback 机制未起效或节点全部失联











