必须统一票据密钥,因Session Tickets依赖服务端无状态解密:各节点需使用完全相同的48字节密钥(如openssl rand 48 > /etc/nginx/ticket.key生成),否则客户端携带的加密票据无法被其他节点识别,导致复用失败并退回到完整TLS握手。

在 Nginx 作为反向代理的集群化部署中,启用 SSL Session Tickets 是实现无状态 TLS 会话复用最直接有效的方式。它不依赖共享内存或外部缓存,客户端自行携带加密票据,各节点只需使用相同密钥即可独立解密验证,天然适配横向扩展架构。
为什么必须统一票据密钥
Session Tickets 的核心在于“服务端无状态”——会话参数由 Nginx 加密后交由客户端保存。但解密能力完全取决于密钥。若集群中不同节点使用不同 ticket key,客户端携带的票据将无法被其他节点识别,导致复用失败,退回到完整 TLS 握手。
- 密钥长度必须为 48 字节(384 位),不可用文本编辑器手动修改,否则解析失败
- 推荐使用
openssl rand 48 > /etc/nginx/ticket.key生成 - 所有 Nginx 实例(包括新扩容节点)必须挂载并读取同一份密钥文件
正确启用与多密钥轮换
仅开启 ssl_session_tickets on 不足以生效,必须显式指定密钥路径。单密钥适用于稳定期;生产环境建议配置多密钥支持平滑轮换。
- 基础配置(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 -s reload在多数版本中不会重载 ticket key,建议执行完整重启:nginx -s stop && nginx
避免与 session cache 冲突
Session Tickets 和 ssl_session_cache shared:SSL:... 机制互斥。若同时启用,Nginx 优先使用后者,Tickets 将被忽略。
- 在集群场景下,应禁用共享缓存:
删除或注释掉类似ssl_session_cache shared:SSL:10m的配置 - 保留
ssl_session_timeout(如5m)仍有效,它控制票据本身的过期时间 - 确认无冲突:检查 Nginx 启动日志,不应出现
session cache is disabled while session tickets are enabled类警告
验证是否真正生效
不能只看配置是否存在,需通过客户端行为和日志交叉验证。
- 使用 OpenSSL 检查复用情况:
openssl s_client -connect example.com:443 -reconnect -tls1_2 2>/dev/null | grep "Reused"
输出Reused, TLSv1.2表示成功复用 - 抓包观察:Wireshark 中 TLS 握手若仅含 ClientHello + ServerHello(无 Certificate/ServerKeyExchange),即为票据复用(1-RTT)
- Nginx 日志中启用
$ssl_session_reused变量,记录r(reused)或.(not reused)



















