启用 ssl_session_cache 是缩短 HTTPS 握手时间最直接有效的方式,必须置于 http 块顶层使用 shared 类型(如 shared:SSL:10m),配合 ssl_session_timeout 4h 和 ssl_session_tickets on 才能实现高复用率与跨进程兼容。

启用 ssl_session_cache 是缩短 HTTPS 握手时间最直接有效的方式——它不改协议、不换硬件,仅靠复用已有会话状态,就能把完整 TLS 握手(3 个 RTT、毫秒级 CPU 运算)压缩为简短复用流程(1–2 个 RTT、耗时下降 70% 以上)。
必须放在 http 块顶层,不能塞进 server 里
该指令只在 Nginx 的 http 上下文中生效,且必须是全局共享配置:
- 写在某个
server块内 → 缓存仅对该域名生效,各 worker 进程无法共享 → 实际复用率极低 - 正确位置示例:
http {<br> ssl_session_cache shared:SSL:10m;<br> ssl_session_timeout 4h;<br>} - 验证是否加载成功:运行
nginx -T | grep ssl_session_cache,输出应明确显示该行位于http块中
选 shared 类型,禁用 builtin
生产环境唯一推荐使用 shared 缓存:
由 ReMe 驱动的记忆管理系统,支持跨会话记忆持久化、自动应用用户偏好以及智能上下文压缩...
-
builtin是每个 worker 独享的小容量缓存(通常仅 1–2KB),多进程下几乎无法复用 -
shared:SSL:10m表示创建名为SSL、大小为 10MB 的共享内存区 - 10MB 可容纳约 4 万–8 万个会话(受证书长度和 TLS 版本影响),中小业务够用;日均 UV 50 万以上建议调至 20m–50m
设准超时时间:4 小时不是玄学,而是兼顾复用与安全的平衡点
ssl_session_timeout 决定会话在内存中保留多久,直接影响复用率和资源占用:
- 默认 5 分钟太短,用户切换网络或页面加载多个资源时极易失效
- 普通 Web 站点推荐 10m–20m;内网网关、API 接入层可设为 2h–4h
- 设为 4h 能覆盖绝大多数浏览器 Keep-Alive 超时(通常 75 秒)和用户活跃周期,实测复用率提升 15% 以上
- 超过 30 分钟需注意合规要求(如 PCI DSS),但 4h 在可信内网场景中被广泛采用且安全可控
搭配 session ticket 使用,释放内存压力并增强跨进程兼容性
仅靠 shared 缓存还不够,必须启用会话票据机制:
-
ssl_session_tickets on;启用 RFC 5077 票据,客户端自行保存加密状态,服务端无需存储,天然支持跨 worker、跨重启复用 -
ssl_session_ticket_key /etc/nginx/ssl/ticket.key;指定密钥文件(二进制,至少 32 字节) - 密钥建议每月轮换一次:用
openssl rand 48 > ticket.key生成新密钥后 reload Nginx - 禁用 ticket 会降低旧客户端(如 Android 4.x)兼容性,也失去“无状态复用”优势










