核心是让所有https站点共用一套tls会话管理机制:统一在http块配置ssl_session_cache shared:ssl:10m和ssl_session_timeout 4h,删除各server块中的builtin私有缓存,合并同类域名至单个server块复用sni,并按实际并发会话数精算共享内存大小。

核心不是“多配几个证书”,而是让所有 HTTPS 站点共用一套 TLS 会话状态管理机制。Nginx 每个 server 块若独立配置 SSL 缓存,会为每个 worker 进程重复加载私有缓存结构,数百个域名就可能吃掉数百 MB 内存;而改用全局共享的 ssl_session_cache shared:SSL:10m,内存占用可压缩到原来的 1/10 甚至更低。
统一提至 http 块的共享 SSL 缓存 zone
必须把 SSL 会话复用所需的共享内存区定义在 http 块顶层,而不是放在每个 server 里:
-
ssl_session_cache shared:SSL:10m;—— 创建名为SSL、大小 10MB 的共享内存区,所有 worker 进程共用 -
ssl_session_timeout 4h;—— 匹配业务会话生命周期,避免过早淘汰或长期滞留 - 删除所有
server块中类似ssl_session_cache builtin:1000的私有缓存配置,它们不仅低效,还会触发重复解析和内存碎片
合并同类 server 块,复用 SNI 与监听上下文
多个域名共用一个 server 块,能直接减少 worker 进程加载的配置结构数量:
- 将一批使用通配符证书或同一 CA 签发的域名归入单个块:
server { listen 443 ssl http2; server_name a.com b.com c.com; ssl_certificate /etc/letsencrypt/live/*.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/*.example.com/privkey.pem; } - Nginx ≥1.15.9 支持 SNI 自动匹配,无需为每个域名单独写
server块 - 若需混合不同证书(如部分域名用 Let’s Encrypt、部分用商业证书),可用
map+ssl_certificate_by_lua*动态加载,但此时需禁用ssl_session_cache,改由 Lua 层控制会话生命周期
精算共享内存大小,避免浪费或不足
10MB 的 shared:SSL 区并非固定值,需按实际会话规模调整:
- 1MB 共享内存约支持 3500–4000 个活跃 TLS 会话(取决于 session ticket 大小和哈希负载)
- 若日均 HTTPS 请求 50 万,平均会话持续 2 小时,则并发活跃会话约在 1.2 万左右 → 建议配置
shared:SSL:32m - 超过 64MB 很少必要,反而可能因内核 slab 分配延迟影响 handshake 性能
- 上线前可用
nginx -T | grep -c "ssl_session_cache"快速检查是否仍有残留私有缓存指令
配套关闭冗余 SSL 相关指令
有些看似无害的配置,在海量虚拟主机场景下会放大内存与 CPU 开销:
- 禁用
ssl_buffer_size 4k;(除非明确需要小包优化),默认 1400 字节更适配大多数网络路径 - 移除
ssl_prefer_server_ciphers on;,现代 TLS 1.3 已不依赖该设置,且开启会增加 cipher negotiation 计算量 - 不启用
ssl_early_data on;除非业务强依赖 0-RTT,否则它会额外维护 early data 状态,增加共享内存压力 - 统一关闭
ssl_session_tickets off;可进一步降低内存波动(若已用shared缓存且不依赖无状态恢复)











