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