ssl_session_timeout仅控制nginx服务端缓存tls会话参数的有效时长,不直接决定https会话是否复用;其调优需匹配业务场景(普通网站10m–20m、内网网关4h、高敏系统5m–10m),并同步配足共享缓存、启用session ticket及ocsp stapling,通过$ssl_session_reused日志和openssl测试验证复用率是否达70%以上。

ssl_session_timeout 控制的是 Nginx 服务端内存中 TLS 会话缓存条目的最大保留时长,它不决定连接是否能复用,而是决定“服务端是否还‘记得’这个会话”。真正能否复用,取决于客户端行为、服务端缓存状态和配套配置三者是否同时满足。
它直接影响会话 ID 复用的有效窗口
当客户端使用 Session ID 方式恢复会话(例如老旧浏览器或部分 Android WebView),Nginx 必须在 ssl_session_timeout 设定的时间内仍保有该 ID 对应的加密上下文,才能跳过完整握手。超时后,即使客户端发来旧 ID,Nginx 也会拒绝复用,强制执行完整 TLS 握手(多耗 1–2 个 RTT)。
- 设为
5m:适合高安全要求场景,但移动端切网、SPA 频繁请求易触发重复握手 - 设为
10m–20m:覆盖用户刷新、标签页切换、短暂离开等典型行为,复用率明显提升 - 设为
4h:仅适用于内网可信环境,需确保ssl_session_cache容量足够(如shared:SSL:50m),否则缓存抖动反而降低效果
对 Session Ticket 复用基本无影响
Chrome v119+、Firefox、Safari 等主流浏览器默认禁用 Session ID 复用,转而依赖 RFC 5077 的 Session Ticket。此时 ssl_session_timeout 不起作用——真正控制 ticket 复用的是 ssl_session_ticket_key 的轮换周期和 ticket 自身 lifetime。
- 若已启用
ssl_session_tickets on,调大ssl_session_timeout不会提升 Chrome 的复用率 - 此时重点应放在密钥管理:定期 reload 新
ssl_session_ticket_key(建议每 24 小时),并避免密钥长期不变
它必须和 ssl_session_cache 协同才生效
单独修改 ssl_session_timeout 几乎无效:
-
ssl_session_cache off或未配置 → 该参数完全不生效 - 使用
builtin缓存 → 多 worker 进程无法共享会话,复用率天然受限 -
shared:SSL:10m+ssl_session_timeout 4h→ 缓存满后频繁淘汰,实际复用率可能下降
推荐生产配置:
-
ssl_session_cache shared:SSL:20m;(约支持 8–10 万个会话) -
ssl_session_timeout 10m;(Web 场景稳妥起点) -
ssl_session_tickets on;(现代浏览器复用主路径)
实际复用是否发生,还得看客户端是否真发会话标识
有些情况下,客户端根本没携带 Session ID 或 Ticket:
- OCSP Stapling 失败导致浏览器主动放弃复用
- 客户端禁用 TLS 会话恢复(极少见,但某些安全策略会如此)
- 使用 HTTP/2 时新建 TCP 连接(如新开标签页),复用与否仍取决于该连接的会话凭证是否有效
验证方式不是看配置是否加载,而是:
- 用
openssl s_client -connect example.com:443 -reconnect观察Reused, SSL handshake succeeded出现频率 - Nginx 日志中开启
$ssl_session_reused变量,统计r(复用)与.(未复用)比例 - 对比调优前后 APM 工具中的 “TLS handshake time”,下降 15% 以上说明优化落地有效
不复杂但容易忽略:ssl_session_timeout 是会话复用链条中的一环,不是开关。它只管“记得多久”,不管“记不记得住”或“客户端愿不愿意”。











