在 Nginx 中配置 `ssl_session_cache` 是优化国密SSL握手性能、降低延迟的首选方法。其核心思路是复用已建立的会话,避免每次都执行一次完整的、计算密集型的 TLS 握手。
国密(SM2/SM3/SM4)的握手计算开销通常比国际算法要高,因此会话复用的重要性尤为突出。一个配置恰当的会话缓存,能让整个握手流程的耗时减少约10%到30%。
一、 `ssl_session_cache` 核心配置指南
1. 基础配置示例
首先,需要建立一个稳固的配置基础。强烈建议在 `http` 块内全局配置,以确保对所有虚拟主机生效。
nginx
http {
# 使用共享内存缓存,命名为SSL,大小建议从10MB起步
ssl_session_cache shared:SSL:10m;
# 设置会话超时时间为4小时
ssl_session_timeout 4h;
# 建议显式开启会话票据,作为无状态的补充
ssl_session_tickets on;
# (可选)强烈建议配置Ticket密钥,使用openssl rand 48 > ticket.key生成,保证重启不失效
# ssl_session_ticket_key /etc/nginx/ssl/ticket.key;
# ... 其他配置
}
2. 关键配置项详解
- `shared:SSL:10m`:表示所有工作进程(Worker Process)共享一个名为“SSL”的缓存区,大小为10MB,是推荐的配置方式。
- `builtin`:使用每个进程私有的缓存,在高并发下无共享价值,不推荐使用。
- `ssl_session_timeout 4h`:缓存会话的有效期。如果设置过短,会导致复用率降低;过长则会占用大量内存。
二、容量规划:如何精准计算并调优缓存大小
盲目设置 `10m` 在高并发下容易导致缓存溢出,反而增加CPU负载。科学的做法是通过公式计算:
推荐缓存大小 ≈ 每秒新建会话数(New Sessions/s) × 超时时间(秒) × 0.5KB
0.5KB (约512字节):是一个相对保守且安全的估算值,因为国密会话(含SM2签名和加密双证书)的实际占用量通常会大于RSA会话,建议评估时考虑适当上浮。
超时时间(秒):可以先用 `4h` (14400秒) 作为公式中的初值。
如何获取 `每秒新建会话数` :基于历史监控数据或压力测试的 `$ssl_session_reused` 日志字段来估算。
配置示例:假设业务高峰期每秒新建约200个会话,套用公式:`200 * 14400 * 512 = 1,474,560,000 字节 ≈ 1.5GB`。
三、会话复用体系协同配置
除了 `ssl_session_cache`,配套的组件必须无缝协作才能最大化复用率。
会话类型对比
Session ID (TLS 1.2):通过在服务器缓存会话ID实现复用,是最传统的缓存方式。
Session Ticket (TLS 1.2+) (推荐用):将加密的会话信息作为“票据”发给客户端,后端不存储,天然支持分布式。
启用`ssl_session_tickets`并配置Ticket Key (最关键):务必开启 `ssl_session_tickets on`,并用 `ssl_session_ticket_key` 指令定义一个外部文件作为密钥。
四、监控、验证与效果评估
验证配置生效:`nginx -T 2>/dev/null | grep "ssl_session_cache"` 应且仅应输出一行 `shared:SSL:10m;`。
检查Ticket Key:`nginx -T 2>/dev/null | grep "ssl_session_ticket_key"` 应输出你配置的密钥文件路径。
核心监控指标 ($ssl_session_reused)
r (reused, 复用):值越高越好。
n (new, 新建):代表未命中缓存。
性能瓶颈判断:若命中率长期低于60%,或者看到 `.n` 的比例突增,通常意味着缓存大小不足或Ticket Key未配置。
五、国密场景下的特殊考量与优化
1. 适配国密Nginx版本:需使用专门支持国密协议的Nginx版本,如集成GmSSL的版本或国密Tengine。
2. 配置国密套件:需显式配置支持国密算法的加密套件,确保协议协商的正确性。
3. 警惕双证书影响:国密协议通常采用包含“签名证书”和“加密证书”的“双证书”体系,这会增加握手计算量,也更凸显会话缓存的重要性。
4. 评估CPU占用与硬件加速:国密SM2的运算负载较高,在流量较高时,可考虑使用支持国密算法的硬件加密卡(如HSM)来分担SM2的计算压力。
六、扩展性能优化建议
系统级优化:升级Linux内核和OpenSSL版本;开启CPU的AES-NI指令集加速;调优内核参数,如增大队列、启用BBR等。
协议和应用层优化:首选TLS 1.3协议;强制启用HTTP/2;启用`tcp_nodelay`和`tcp_nopush`;在数据包小、实时性要求高的场景下调小`ssl_buffer_size`;启用OCSP Stapling;合并证书链并优化Keepalive长连接。
七、总结与最佳实践
1. 核心三件套:永远使用 `ssl_session_cache shared:SSL:大小;`,永远开启并配置 `ssl_session_tickets on` 和 `ssl_session_ticket_key`。
2. 容量先行:在配置前,务必基于业务峰值估算出合理的缓存大小,避免“10m打天下”的误区。
3. 持续监控:部署后,将 `$ssl_session_reused` 的命中率作为核心性能指标,纳入监控告警体系。
4. 国密专项:在部署国密Nginx时,务必确认双证书体系和加密套件的配置,并进行充分的压力测试。
将这些配置和优化方法应用起来,可以显著提升你的国密网站性能。如果想了解更具体的监控配置、Ticket Key的生成细节,或是国密双证书的配置,随时可以再问我~