核心是统一ssl_session_ticket_key实现无状态会话复用:所有节点用相同48字节密钥文件解密客户端票据,禁用ssl_session_cache,支持多密钥轮换,确保跨节点TLS会话复用。

要在负载均衡集群中实现 HTTPS 会话的无缝复用,核心不是“让所有节点记住同一个会话”,而是让所有节点能**独立解密同一个客户端票据**——这靠的是统一、合规、可轮换的 ssl_session_ticket_key,而非共享内存或外部缓存。
所有节点必须使用完全相同的 48 字节密钥文件
Session Tickets 的本质是:服务端把加密后的会话上下文(主密钥、密码套件等)打包成票据,交给客户端保存;下次连接时,客户端在 ClientHello 中携带该票据,任意 Nginx 实例只要持有相同密钥,就能本地解密并恢复会话。
- 用
openssl rand 48 > /etc/nginx/ticket.key生成一次,严格 48 字节二进制,不可编辑、不可重复生成 - 将该文件同步到集群中每一台 Nginx 服务器的相同路径(如
/etc/nginx/ticket.key) - 设置权限为
0400,属主为 nginx 运行用户(如www-data或nginx) - 配置中明确启用并指向该文件:
ssl_session_tickets on;<br>ssl_session_ticket_key /etc/nginx/ticket.key;
禁用冲突机制:关掉 ssl_session_cache
Session Tickets 和传统 ssl_session_cache 是互斥机制。若同时启用,Nginx 优先使用 cache,票据可能被忽略,且多机部署下 cache 无法同步,反而导致复用率下降。
- 删除或注释掉类似
ssl_session_cache shared:SSL:10m的配置 - 确保没有
ssl_session_timeout与票据逻辑混用(它只对 session ID 有效) - 验证方式:用
openssl s_client -connect example.com:443 -reconnect查看是否输出Reused, TLS,且Session-ID:为空
支持平滑密钥轮换:按顺序声明多个密钥
生产环境不能长期使用同一密钥。Nginx 允许最多配置 10 个 ssl_session_ticket_key 指令,规则清晰:
- **第一行密钥用于加密新票据**(即客户端下次收到的票据)
- **所有已列出的密钥均可解密旧票据**(含已下发但尚未过期的连接)
- 新增密钥必须加在最前面(置顶),不能替换或删除旧行
- 示例配置:
ssl_session_ticket_key /etc/nginx/ticket.key.v20260501;<br>ssl_session_ticket_key /etc/nginx/ticket.key.v20260401;<br>ssl_session_ticket_key /etc/nginx/ticket.key.v20260301;
验证是否真正跨节点生效
仅单机测试成功不等于集群可用。需确认客户端在跳转不同后端节点时仍能复用:
- 用 curl 或浏览器访问,配合负载均衡器(如 DNS 轮询、IP Hash 关闭、或四层随机转发),观察多次请求是否持续显示
Reused, TLS - 抓包检查 ClientHello 是否含
session_ticket扩展,ServerHello 是否返回NewSessionTicket - 查看 Nginx error log,确认无
SSL_do_handshake() failed或failed to load ticket key类错误 - 故意停掉某台 Nginx,剩余节点仍应能解密历史票据——这是无状态复用的关键证据


















