直接在http块顶层配置ssl_session_cache shared:ssl:10m和ssl_session_timeout 10m可显著提升https会话复用率,跳过完整握手以降低延迟和cpu消耗;必须统一声明于http块开头,禁用builtin,配合ssl_session_tickets on及严格权限的ticket密钥,并通过$ssl_session_reused和openssl测试验证实效。

直接在 http 块顶层配 ssl_session_cache shared:SSL:10m 和 ssl_session_timeout 10m,就能让重复 HTTPS 连接跳过完整握手——这不是锦上添花,而是降低延迟和 CPU 消耗最立竿见影的一步。
必须放在 http 块顶层,不能塞进 server 块里
会话缓存若只写在某个 server 块内,就变成该虚拟主机独占、无法被多个 worker 进程共享,复用率基本为零。Nginx 的 shared 缓存依赖进程间共享内存,只有放在 http 块开头才生效。
-
ssl_session_cache shared:SSL:10m中的SSL是名称标识,不可省略,后续日志和监控靠它区分 -
10m约支持 4 万个会话,日均百万请求够用;高并发可升至20m - 别写成
builtin或off:前者仅单 worker 可用,后者直接禁用复用
timeout 要匹配真实访问节奏,不是越长越好
ssl_session_timeout 决定缓存项存活时间,设太短用户切个页面或加载子资源就失效;设太长则内存占用高,还可能违反合规要求。
- 普通 Web 站点(含移动端):推荐
ssl_session_timeout 10m或20m - 内网 API 网关等可信环境:可设
4h,实测降握手延迟超 40% - 金融/政务类系统:建议
5m–10m,平衡安全窗口与可用性 - 务必检查缓存是否满:满后新会话会挤掉旧项,导致提前失效
搭配 ssl_session_tickets 形成无状态复用
仅靠服务端缓存仍需维护状态;启用 ssl_session_tickets on 后,会话密钥由客户端携带,Nginx 节点无需共享内存即可复用,天然支持横向扩展。
- 生成 48 字节密钥:
openssl rand 48 > /etc/nginx/ticket.key - 配置路径权限严格:
chmod 600 /etc/nginx/ticket.key,属主为nginx - 多节点部署时,所有机器必须使用**完全相同的密钥文件**
- 如需轮换,可列多个
ssl_session_ticket_key,新票据用最新密钥加密,旧票据用任一密钥解密
验证复用是否真生效,不能只看配置加载成功
配置 reload 成功不代表复用起作用,得看实际连接行为。
- 用 OpenSSL 测试:
openssl s_client -connect example.com:443 -reconnect -servername example.com 2>/dev/null | grep "Reused, TLS",出现Reused, TLS才算成功 - Nginx 日志加变量:
$ssl_session_reused,值为t表示复用,.表示新建 - 后端也走 HTTPS(如反向代理)时,必须同时开启
proxy_ssl_session_reuse on,否则复用链路断在中间
真正容易被忽略的是:缓存容量和 timeout 必须协同调优——光设大 timeout,但 10m 缓存早满了,照样没用;而密钥文件权限不对或跨节点不一致,ssl_session_tickets 就形同虚设。











