Nginx TLS会话共享缓存需在http块顶层配置ssl_session_cache shared:SSL:10m,配合ssl_session_timeout、ssl_session_tickets及密钥,并禁用builtin/off模式,再通过$ssl_session_reused日志和openssl测试验证复用率≥70%。

要在 Nginx 中正确配置 TLS 会话共享缓存(Shared Memory Session Cache),核心是让多个 worker 进程能共用同一块内存来存储会话状态,从而真正提升复用率。这不是加几行配置就能生效的事,而是一组必须协同工作的设置。
必须在 http 块顶层声明 shared 缓存
shared 类型缓存只能且必须写在 http { } 块最开始的位置,不能放在 server 或 location 块里:
-
ssl_session_cache shared:SSL:10m;—— 名称SSL可自定义,但要统一;10m表示分配 10MB 共享内存,约可存 4–5 万个会话条目 - 大小建议起步设为
10m~20m,高并发场景按公式估算:new_sessions_per_sec × timeout_sec × 0.5KB - 重复声明同名缓存会被静默忽略,用
nginx -T | grep "ssl_session_cache.*shared"验证是否只出现一行,且位于http {之后、任何server {之前
配合合理的超时与票据机制
仅配缓存不够,还需控制生命周期和提供无状态兜底:
-
ssl_session_timeout 4h;—— 推荐值 1–8 小时,兼顾复用率与安全;太短导致频繁新建握手,太长增加密钥泄露风险 -
ssl_session_tickets on;—— 显式开启 Session Tickets,客户端可本地保存加密票据,服务端无需存储状态 -
ssl_session_ticket_key /etc/nginx/ticket.key;—— 密钥需为 48 字节二进制文件(openssl rand 48 > ticket.key),权限设为600,属主为 nginx 用户
禁用无效模式,避免干扰
builtin 和 off 模式在多 worker 场景下基本无效,应主动排除:
- 删除所有
server块中出现的ssl_session_cache配置,防止误覆盖或冲突 - 不使用
builtin:1024—— 它仅限单个 worker 使用,无法跨进程共享,实测复用率趋近于零 - 不设为
off或none,否则完全关闭复用能力
验证是否真正起作用
配置加载成功 ≠ 实际生效,要通过行为指标确认:
- 日志中加入
$ssl_session_reused变量,长期观察r(复用)占比,稳定 ≥70% 才算有效 - 用命令测试:
openssl s_client -connect example.com:443 -reconnect,反复执行时应频繁看到Reused, SSL handshake succeeded - 若 CPU 使用率明显下降、首字节时间(TTFB)缩短,也侧面说明完整握手减少


















