nginx实现基于cookie的会话保持需借助nginx-sticky-module-ng等第三方模块或nginx plus,通过配置sticky cookie指令(如srv_id、expires、domain等)绑定用户与后端服务器,并配合proxy_pass及必要header透传;官方版默认不支持,ip_hash等替代方案存在明显局限。

要让 Nginx 实现基于 Cookie 的会话保持,本质是让同一用户后续请求始终落到同一台后端服务器上。官方开源版 Nginx 默认不支持该功能,必须借助第三方模块或升级到商业版 Nginx Plus 才能落地。
确认是否已启用 sticky 模块
运行 nginx -V 2>&1 | grep sticky,有输出说明模块已编译进 Nginx;若无结果,需重新编译安装 nginx-sticky-module-ng(推荐活跃分支,兼容 Nginx 1.20–1.24)。系统包管理器安装的 Nginx 通常不含该模块,不建议强行加载动态模块,易引发兼容问题。
配置 upstream 中的 sticky 指令
在 http 块中定义 upstream,并添加 sticky 行:
- sticky cookie srv_id expires=1h domain=.example.com path=/ httponly secure; —— 其中 srv_id 是自定义 Cookie 名,值由模块自动生成并绑定后端节点
- expires=1h 建议设为略长于业务最长空闲时长,避免过早失效导致重绑定
- domain 必须带前导点(如 .example.com),确保子域名间 Cookie 可共享;path=/ 覆盖全站路径
- httponly 防 XSS 窃取,secure 强制仅 HTTPS 传输(生产环境必加)
代理转发与 header 处理要点
在 server 块的 location 中使用 proxy_pass 指向该 upstream,同时注意:
- 必须保留原始 Host 头:proxy_set_header Host $host;
- 透传真实客户端 IP:proxy_set_header X-Real-IP $remote_addr; 和 X-Forwarded-For $proxy_add_x_forwarded_for;
- 若后端依赖 Cookie 路由,禁止改写或清除 Set-Cookie 响应头(尤其避免 proxy_hide_header)
替代方案与适用边界
当无法编译模块时,可考虑:
- ip_hash:简单但不可靠,NAT、移动网络、CDN 下易失效,仅适合内网固定 IP 场景
- cookie + map + upstream 自定义路由:用 map 提取请求 Cookie,再通过变量控制 proxy_pass 目标,无需额外模块,但配置较复杂
- 后端 Session 共享:更推荐的长期解法——接入 Redis 或数据库统一存储 Session,Nginx 回归纯轮询,提升扩展性与容错能力











