跳转到主内容
极星编程网:以代码为星,赴技术山海!

详解 ssl_session_tickets:跨服务器集群实现无缝 SSL 会话复用

ssl_session_tickets是跨服务器集群实现HTTPS会话复用的最优方案,它通过客户端携带加密票据、服务端本地解密的方式避免TLS完整握手,无需外部依赖且天然无状态。 要让 HTTPS 请求在跨服务器集群中跳过完整 TLS 握手、实现毫秒级复用, ssl_session_tickets 是目前最轻量、最可靠的选择。它不依赖 Redis、共享内存或任何外部组件,而是把加密后的会话状态交给客户端携带,服务端仅靠本地密钥解密即可恢复上下文——只要所有节点密钥一致,任意机器都能处理复用请求。 为什么必须用 session tickets 而不是 session cache 传统
ssl_session_cache shared:SSL:50m
依赖单机共享内存,多节点时必须引入 Redis 或 memcached 同步缓存,带来额外延迟、配置复杂度和故障点。而 session tickets 天然无状态:Nginx 将主密钥、密码套件、协商参数等用 AES-256-GCM 加密打包成票据,由客户端在后续
ClientHello
的
session_ticket
扩展中带回。服务端无需查表,只用预置密钥解密,就能还原完整会话。 Session ID 模式需所有节点访问同一份缓存,强耦合、难扩展 Session Tickets 模式客户端即“移动数据库”,服务端零同步、纯本地计算 二者互斥:若同时启用,Nginx 优先使用 session cache,tickets 会被忽略 集群级统一密钥配置要点 所有 Nginx 实例必须严格共用同一套票据密钥,且路径、权限、内容完全一致: php中将session保存到数据库的函数类代码 php中将session保存到数据库的函数类代码 下载 生成唯一 48 字节二进制密钥:
openssl rand 48 > /etc/nginx/ticket.key
(不可用文本编辑器打开或修改) 分发到每台机器相同路径,属主设为 nginx 运行用户(如
www-data
),权限严格设为
0400
在
http
或
server
块中显式启用:
ssl_session_tickets on;
ssl_session_ticket_key /etc/nginx/ticket.key;
禁用冲突的 session cache:注释或删除所有
ssl_session_cache
行 安全轮换:支持多密钥的实操方式 生产环境不能长期使用单密钥。Nginx 1.19.4+ 支持
ssl_session_ticket_keys
指令(注意是复数形式),可按行加载最多 10 个密钥,每行 80 字节(48 字节 AES key + 32 字节 HMAC key): 首行密钥用于加密新票据,所有列出的密钥都可用于解密旧票据 轮换时只需更新密钥文件内容并执行
nginx -s reload
(1.19.4+ 支持热重载) 推荐保留最近 3–4 个密钥,覆盖典型票据生命周期(默认约 4–8 小时) 避免误用旧语法:
ssl_session_ticket_key
只认第一个密钥,后续行被静默忽略 快速验证是否真正生效 不用抓包,两条 OpenSSL 命令即可确认: 首次连接(应新建会话):
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:
字段为空 检查 Nginx error log,确保无
SSL_do_handshake() failed
或密钥读取错误

相关文章