nginx共享内存必须在http块顶层用shared方式声明,如ssl_session_cache shared:ssl:10m;否则各worker独占缓存导致复用率趋近于0,且需配合session ticket与定期密钥轮换以保障跨进程复用效果。

关键是在 http 块顶层用 shared 方式声明缓存区,让所有 worker 进程共享同一块内存,而不是各自维护私有缓存。这样客户端重连时才能真正复用会话,跳过完整握手。
必须放在 http 块开头统一配置
不能写在某个 server 块里,也不能分散在多个地方。Nginx 的 shared 缓存依赖 POSIX 共享内存机制,只有 master 进程在启动时创建、所有 worker 映射同一地址空间才有效:
- 正确写法:
ssl_session_cache shared:SSL:10m;(名称SSL可自定义,但需一致) - 错误写法:
ssl_session_cache builtin:4096;或只写ssl_session_cache 10m;—— 每个 worker 独占一份,复用率趋近于 0 - 重复声明同名 zone 会被合并,但参数不一致可能引发未定义行为,应避免
合理设置大小和超时时间
缓存太小会频繁淘汰,太大则浪费内存;超时太短用户切网就失效,太长又滞留无效条目:
- 估算大小:按
QPS × timeout × 0.5KB计算。例如峰值 1200 新连接/秒、timeout 设为 10 分钟(600 秒),需约 360MB,建议配shared:SSL:512m - 超时推荐值:普通 Web 站点设 10–20 分钟;内网 API 或可信后台可设 4 小时;高频探测类连接可压至 2 分钟,配合更大容量防淘汰
搭配 session ticket 提升跨进程/跨机器复用能力
shared 缓存是单机有状态方案,ticket 是无状态补充,尤其适合多 worker 或集群场景:
- 启用:
ssl_session_tickets on; - 指定密钥:
ssl_session_ticket_key /etc/nginx/ssl/ticket.key;(二进制文件,至少 32 字节,可用openssl rand 48 > ticket.key生成) - 密钥建议每 24–48 小时轮换一次,reload Nginx 即可,旧 ticket 仍可解密,新 ticket 自动使用新密钥
验证是否真的生效
别只看配置语法正确,要观察实际复用行为:
- 用命令测试:
openssl s_client -connect example.com:443 -reconnect,输出含Reused, SSL handshake has read 0 bytes才算成功复用 - 在日志中记录
$ssl_session_reused变量:值为.表示复用,空或0表示新建 - 检查系统共享内存段:
ipcs -m | grep nginx,确认有名称匹配的段,且权限正常











