nginx官方不支持cookie会话粘滞,需编译第三方sticky模块(如nginx-sticky-module-ng)实现;该模块通过设置route类cookie绑定用户与后端,解决无共享session时的登录态丢失问题,但仅兼容nginx≤1.18版本。

在 Nginx 中,官方版本并不原生支持基于 Cookie 的会话粘滞(Session Sticky),sticky 模块是第三方模块(如 nginx-sticky-module-ng)提供的功能,需手动编译安装。它通过在响应中插入特定 Cookie(如 route),并依据该 Cookie 将后续请求定向到同一后端服务器,实现会话保持。
为什么需要 sticky 模块?
当后端应用(如 PHP、Java Web)未做共享 Session(如未使用 Redis 或数据库集中存储),而前端用 Nginx 做负载均衡时,用户多次请求若被分发到不同节点,会导致登录态丢失、购物车清空等问题。sticky 模块可强制“同一个用户始终访问同一台后端”,绕过 Session 共享的改造成本。
编译安装 nginx-sticky-module-ng
该模块已多年未更新,仅适配较老版本 Nginx(建议 ≤1.18),不兼容 1.19+ 及主线最新版。操作前请确认 Nginx 版本:
- 下载对应版本的 Nginx 源码(如
nginx-1.18.0.tar.gz) - 克隆模块仓库:
git clone https://github.com/evanmiller/nginx-sticky-module-ng.git - 进入 Nginx 源码目录,执行 configure(需带上原有参数 + 模块路径):
./configure --add-module=../nginx-sticky-module-ng [其他已有选项] - 运行
make && sudo make install,替换旧 Nginx 二进制文件
配置 sticky 实现 Cookie 会话保持
在 upstream 块中启用 sticky,并指定 Cookie 名称与属性:
upstream backend {
sticky cookie srv_id expires=1h domain=.example.com path=/;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
-
srv_id是生成的路由标识名(也可写为sticky),Nginx 会自动为每个后端分配唯一 ID 并写入该 Cookie -
expires=1h控制 Cookie 过期时间;domain和path用于作用域控制,确保子域名或路径下有效 - 客户端首次访问无该 Cookie 时,Nginx 按默认算法(轮询)选择后端,并在响应头中 Set-Cookie;后续请求携带该 Cookie 即固定路由
验证与注意事项
用浏览器开发者工具查看响应头是否含 Set-Cookie: srv_id=...,再刷新页面确认请求始终命中同一台后端(可通过日志或返回 header 标识验证):
- 模块不支持 HTTPS 下的 Secure 属性自动添加,如需安全传输,须配合
secure参数(部分分支支持:sticky cookie ... secure;) - 若后端节点宕机,sticky 默认不自动失效,用户会持续请求失败——可搭配
down标记或健康检查缓解 - 现代更推荐用
ip_hash(简单但不精准)或应用层 Session 共享方案;sticky 适合短期过渡或遗留系统
不复杂但容易忽略:务必确认模块与 Nginx 版本兼容,且生产环境上线前充分测试 Cookie 生效逻辑和故障转移行为。










