ssl_session_tickets的核心作用是实现无状态tls会话复用:客户端自携加密票据,所有节点用统一48字节密钥即可独立解密复用,无需共享内存或外部缓存;必须禁用ssl_session_cache、显式配置ticket_key、支持多密钥轮换并验证reused状态。

启用 ssl_session_tickets 是 Nginx 实现无状态 HTTPS 加速最直接有效的方式——它把会话状态加密后交给客户端保存,服务端只需管理密钥,不再依赖共享内存缓存,从而规避锁竞争、内存膨胀和跨节点不一致问题。
为什么比 session cache 更适合高并发场景
传统 ssl_session_cache shared:SSL:10m 在百万级连接下很快触顶:每条会话占约 200 字节,10MB 仅能存约 5 万个会话;一旦淘汰频繁,复用率断崖下跌。而 session tickets 完全卸载服务端存储压力,只要密钥一致,单台或集群都能解密任意客户端携带的票据,理论支持无限并发。
- 节省 1–2 个 RTT:客户端复用票据时跳过证书发送、密钥交换等步骤,直接进入应用数据阶段
- 降低 CPU 开销:避免每次握手都做非对称加解密运算,尤其对 RSA 密钥交换型客户端更明显
- 天然适配负载均衡:无需同步缓存状态,多实例只需共用同一份 ticket.key 即可无缝协作
必须严格配置的三项关键参数
只写 ssl_session_tickets on; 是无效的。Nginx 默认不加载密钥,启动时自动生成临时密钥,导致旧票据无法解密,复用率归零。
-
生成固定 48 字节密钥文件:在可信机器执行
openssl rand 48 > /etc/nginx/ticket.key,验证ls -l /etc/nginx/ticket.key输出大小为 48 -
设置严格权限与属主:运行用户(如 nginx 或 www-data)独有读取权,
chmod 400 /etc/nginx/ticket.key && chown nginx:nginx /etc/nginx/ticket.key -
显式绑定密钥路径:在 server 或 http 块中同时配置
ssl_session_tickets on;和ssl_session_ticket_key /etc/nginx/ticket.key;
搭配使用才真正生效
单独开启票据只是第一步。要让性能优势落地,还需协同调整其他参数:
- 禁用冲突的缓存:
ssl_session_cache和ssl_session_tickets同时启用时,Nginx 优先走缓存路径,票据可能被绕过,建议注释掉ssl_session_cache行 - 延长复用窗口:
ssl_session_timeout 4h(默认仅 5 分钟),给客户端足够时间复用票据 - 限定协议版本:
ssl_protocols TLSv1.2 TLSv1.3;,TLS 1.3 已用 PSK 替代票据机制,但该配置确保 TLS 1.2 票据正常工作 - 若反向代理 HTTPS 后端,需额外启用
proxy_ssl_session_reuse on;并确保后端也支持票据复用
如何验证票据是否真正生效
不能只靠 nginx -t 或配置加载成功来判断。真实复用需观察客户端行为:
- Chrome DevTools → Network → 点击任意 HTTPS 请求 → Headers → 查看
Request Headers中是否有Sec-WebSocket-Extensions类字段(非必需),更可靠的是看Timing标签页:复用票据时 “SSL” 阶段耗时通常低于 5ms - 命令行测试:
openssl s_client -connect example.com:443 -reconnect -servername example.com 2>/dev/null | grep "Reused",若输出含Reused, SSL handshake has read 0 bytes and written 0 bytes,说明命中复用 - 检查日志字段:
$ssl_protocol/$ssl_cipher $request_time若大量请求在 TLSv1.2 下request_time显著低于首次握手(如











