nginx本身不存储session,仅作无状态反向代理;session共享需后端统一写入redis集群,tomcat用tomcat-redis-session-manager,spring boot用spring-session-data-redis,配合哨兵或cluster实现高可用与自动故障转移。

在 Nginx 集群架构中,Nginx 本身不负责 Session 存储,它只是无状态的反向代理和负载均衡器。真正的 Session 集群化必须由后端应用层配合外部共享存储完成。核心目标是:无论请求被分发到哪台后端节点,都能读取到同一份会话数据。
推荐方案:Session 外置到 Redis 集群
这是当前生产环境最成熟、高可用、可扩展的实践方式。所有后端服务(Tomcat、Spring Boot、PHP、Node.js 等)统一将 Session 写入同一个 Redis 主从+哨兵集群或 Redis Cluster,Nginx 完全无需感知 Session,仅按轮询、least_conn 或加权方式转发即可。
- Tomcat:集成
tomcat-redis-session-manager,配置context.xml指向 Sentinel 地址,自动处理故障转移 - Spring Boot:引入
spring-session-data-redis,启用@EnableRedisHttpSession,支持序列化、过期自动清理与命名空间隔离 - 关键参数:设置
maxInactiveIntervalInSeconds=1800(30 分钟),避免内存堆积;启用saveMode=ON_SET_OR_GET减少无效写入 - Redis 需开启 RDB+AOF 持久化,并部署至少一主二从 + 哨兵,或直接使用 Redis Cluster 提升水平扩展能力
慎用方案:Sticky Session(会话粘性)
这类方案不解决 Session 共享本质问题,仅作临时兜底或过渡使用。它让 Nginx 强制把用户绑定到某台后端,但一旦该节点宕机,Session 即丢失,且无法支撑弹性扩缩容。
抓取并分析 OpenClaw JSONL 会话日志,重建并回填代理记忆文件。适用于:(1) 模型切换后记忆不完整,(2) 验证记忆覆盖度,(3) 重建丢失记忆,(4) 通过 cron/heartbeat 自动同步每日记忆。支持简单提取及基于 LLM 的叙事摘要,并自动清理敏感信息。
- ip_hash:按客户端 IP 哈希分发。适用于内网固定 IP 场景;不适用于 NAT、4G/5G 移动网络(IP 易变),也不支持节点增减后的平滑重哈希
-
cookie hash(如
hash $cookie_JSESSIONID consistent):比 ip_hash 更精准,但依赖后端已生成并返回有效 Cookie;首次无 Cookie 请求需配合 fallback 策略 - 若必须启用,建议搭配 Redis 双写——即 sticky 生效时仍同步写入 Redis,确保故障漂移后会话可恢复
应避免的方案
这些方式在现代分布式架构中已被证实不可靠或存在严重瓶颈,不应作为主路径采用。
- 数据库存储 Session:MySQL 等关系型数据库会因高频读写成为性能瓶颈,连接池耗尽、锁表、事务延迟等问题在 QPS 过千时即显现;仅适合导出审计日志等离线用途
- 本地文件/NFS 共享:多节点并发写入易冲突;NFS 缓存一致性差;缺乏自动过期机制;运维复杂且故障率高
- Session 复制(如 Tomcat 默认集群):节点间广播同步带来网络与 CPU 压力,集群规模增大后延迟显著上升,不适合中大型系统
配套要点:健康检查与 Token 化演进
即使 Session 已集中存储,Nginx 层仍需保障流量不打到异常节点,否则用户可能收到 502/504,误判为登录失效。
- 配置主动健康检查:
health_check interval=3 rise=2 fall=3,结合max_fails和fail_timeout快速剔除故障实例 - 长期演进方向是逐步转向 JWT 或 OAuth2 Token 无状态认证:登录后颁发签名 Token,后端校验而非查 Session;Nginx 可透传
Authorization头,完全剥离会话管理职责 - 若需前置校验,可用 OpenResty +
lua-resty-jwt模块做轻量级 Token 验证,但建议由 API 网关统一承接










