通过统一分发48字节ssl会话票据密钥文件并配置server块内ssl_session_ticket_key,可实现nginx多节点https票据同步复用;需严格校验密钥一致性、禁用session_cache、支持多密钥轮换及版本适配重载。

密钥必须字节级一致且严格分发
所有节点的密钥文件内容必须完全相同,不能靠本地生成或手动编辑:
- 在可信机器上一次性生成:
openssl rand 48 > /etc/nginx/ticket.key.v20260619 - 验证长度:
ls -l /etc/nginx/ticket.key.v20260619输出必须是 48 - 设权限为
0400,属主为 Nginx 运行用户(如www-data或nginx) - 通过 Ansible、rsync 或配置中心同步到所有节点的相同路径
- 各节点执行
sha256sum /etc/nginx/ticket.key.v20260619校验一致性
配置必须写在 server 块内,不可只放顶层 http
避免被虚拟主机覆盖或继承冲突,每个对外 HTTPS 的 server 块都要显式声明:
ssl_session_tickets on;ssl_session_ticket_key /etc/nginx/ticket.key.v20260619;- 禁用
ssl_session_cache(删除或注释掉类似ssl_session_cache shared:SSL:10m的行),二者互斥
支持安全轮换:多密钥按序加载
生产环境需滚动更新密钥,Nginx 按配置顺序处理,首行为加密密钥,其余均可解密旧票据:
- 在同一个
server块中连续写多行:ssl_session_ticket_key /etc/nginx/ticket.key.v20260619;<br> ssl_session_ticket_key /etc/nginx/ticket.key.v20260605;<br> ssl_session_ticket_key /etc/nginx/ticket.key.v20260522;
- 轮换时,把新密钥插入最上方,保留最近 3–4 个(覆盖票据最大生命周期,建议 ≥24 小时)
- 旧密钥文件不删、不覆盖、不修改,确保跨机房历史票据仍可解密
重载生效方式取决于 Nginx 版本
密钥变更后必须让 Nginx 加载新配置,但方式有差异:
- Nginx ≤ 1.19.3:
nginx -s reload不重载密钥,必须完整重启(systemctl restart nginx或nginx -s stop && nginx) - Nginx ≥ 1.19.4:支持热重载,
nginx -s reload即可生效 - 若使用 nginx-extras + njs,还可动态读取密钥文件,绕过配置重载(需配套 JS 脚本)
验证票据是否真正同步生效
不依赖抓包,终端一条命令即可确认:
- 首次连接:
openssl s_client -connect example.com:443 -servername example.com -no_tls1_3 2>/dev/null | grep "New, TLS"→ 应显示 New - 二次连接:
openssl s_client -connect example.com:443 -servername example.com -reconnect -no_tls1_3 2>/dev/null | grep "Reused, TLS"→ 出现 Reused 表示复用成功 - 检查输出中
Session-ID:字段为空(票据模式标志),且 Nginx error log 无密钥读取失败日志











