在分布式 Nginx 集群中应优先选用 ssl_session_tickets 实现 TLS 会话复用,因其无需共享内存或外部缓存,客户端携带加密票据、服务端本地解密即可,天然支持无状态横向扩展;配置需统一密钥(48 字节)、启用票据并禁用冲突的 session cache。

在分布式 Nginx 集群中,要让 HTTPS 请求在多次连接间跳过完整 TLS 握手、实现毫秒级复用,ssl_session_tickets 是比传统 ssl_session_cache 更轻量、更可靠的选择。它不依赖共享内存或外部缓存,天然适配横向扩展架构。
为什么选 session tickets 而不是 session cache?
传统 ssl_session_cache shared:SSL:10m 要求所有节点访问同一块共享内存——这在多机部署下必须借助 Redis/memcached 同步,引入额外组件和故障点。而 session tickets 把会话状态加密后交给客户端携带,Nginx 只需本地解密即可验证复用。只要密钥一致,任意节点都能独立处理票据,真正实现无状态。
关键配置步骤(集群级生效)
确保所有 Nginx 实例使用完全相同的票据密钥,并启用票据功能:
- 生成 48 字节密钥文件(不可重复,不可用文本编辑器手动改):
openssl rand 48 > /etc/nginx/ticket.key - 在
http或server块中添加:ssl_session_tickets on;<br>ssl_session_ticket_key /etc/nginx/ticket.key;
- 如需轮换密钥(推荐),可按顺序列出最多 10 个密钥文件,新票据用最新密钥加密,旧票据仍可用历史密钥解密:
ssl_session_ticket_key /etc/nginx/ticket.key.v2;<br>ssl_session_ticket_key /etc/nginx/ticket.key.v1;
- 重启 Nginx(注意:
nginx -s reload在部分版本中不重载 ticket key,建议 full restart)
如何验证票据复用是否成功?
用 OpenSSL 命令行快速测试:
使用 Playwright 为 jimeng.jianying.com 管理浏览器会话,导入 cookies/localStorage 以自动化视频生成工作流,支持图片上传等功能
- 首次连接(应建立新会话):
openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | grep "New, TLS" - 第二次连接(带票据重试):
openssl s_client -connect example.com:443 -reconnect -servername example.com 2>/dev/null | grep "Reused, TLS"
若第二条输出含 Reused, TLS,说明票据复用生效。同时检查输出中的 Session-ID: 应为空,Session-ID-ctx: 通常也为空——这是票据模式的典型标志。
必须避开的三个坑
这个机制简洁高效,但容错性极低,以下三点任一出错都会导致降级为完整握手:
- 任意一台 Nginx 节点的
ssl_session_ticket_key文件内容与其他节点不同 - 密钥文件长度不是严格 48 字节(
ls -l /etc/nginx/ticket.key确认) - 启用了
ssl_session_cache且未关闭ssl_session_tickets,两者共存时行为不可控(建议禁用 cache 或明确设为off)










