必须在http块顶层配置shared:ssl缓存(如shared:ssl:10m),禁用builtin模式,配合tlsv1.2+、ssl_prefer_server_ciphers off及$ssl_session_reused日志验证,windows需设worker_processes 1。

在多 Worker 进程的 Nginx 生产环境中,只有启用 shared 类型的 ssl_session_cache 才能真正实现跨进程会话复用。默认的 builtin 模式会让每个 worker 维护独立缓存,导致客户端被调度到不同 worker 时反复触发完整 TLS 握手——这直接抵消了会话复用的价值。
必须放在 http 块顶层配置 shared 缓存
shared 缓存必须定义在 http 块最外层,不能写在某个 server 块内部。否则它只对该 server 生效,且无法被其他 worker 共享。
- 正确写法:
ssl_session_cache shared:SSL:10m;和ssl_session_timeout 4h;直接放在 http 块中 - 命名统一:多个 server 块可共用同一块共享内存,只要 name(如
SSL)和大小一致 - 容量参考:10MB 约支持 4 万–8 万个会话;若并发高、连接生命周期长,可酌情增至 20m
配合协议与加密策略强化复用效果
仅配置 shared 缓存不够,还需确保握手流程本身支持高效恢复。
- 强制启用 TLSv1.2 及以上:
ssl_protocols TLSv1.2 TLSv1.3;(禁用 TLSv1.0/1.1) - 关闭服务端优先密码套件:
ssl_prefer_server_ciphers off;(TLSv1.3 下自动忽略,但保持兼容性) - 若需兼顾 TLSv1.2 客户端,建议保留 session cache;TLSv1.3 主要依赖 PSK,但 shared 缓存仍为降级场景兜底
Windows 环境需特殊处理
Windows 官方二进制版不支持 POSIX 共享内存,shared: 语法会启动失败。
- 只能使用
builtin:1024;,且每个 worker 独立缓存,无跨进程共享能力 - 为提升实际复用率,应设
worker_processes 1;,避免请求分散导致命中率归零 - 超时建议设为
ssl_session_timeout 10m;,过长无意义,过短加剧淘汰
验证是否真正生效
不能只看配置是否存在,要确认缓存被读写、复用被触发。
- 用
nginx -T | grep ssl_session_cache检查是否加载到 http 块 - OpenSSL 测试:
openssl s_client -connect example.com:443 -reconnect,观察输出中是否出现Reused, SSL handshake succeeded - 日志中添加
$ssl_session_reused字段(值为r表示复用),统计比例是否稳定在 70% 以上 - Linux 下可用
ipcs -m | grep ng查看 Nginx 创建的共享内存段是否存在











