nginx ssl性能优化关键在于减少tls握手cpu开销:优先配置ssl_conf_command限制曲线与签名算法,启用共享会话缓存和ocsp装订,精简协议版本与缓冲区。

Nginx 中 SSL 指令的解析顺序本身不直接影响 CPU 开销——因为这些指令在配置加载阶段一次性解析、编译并缓存,运行时不会反复“解析”。真正影响每秒请求 CPU 开销的,是 TLS 握手过程中的密码运算、密钥交换、证书验证、OCSP 响应处理等运行时行为。优化目标应聚焦于:减少握手计算量、避免重复验证、提升会话复用率、精简协商路径。
以下是从实际性能出发的关键配置策略,按优先级和效果组织:
显式控制密钥交换与签名算法,缩短协商路径
TLS 握手初期需交换支持的曲线和签名算法,客户端若发来大量低效或冷门选项(如 secp384r1、ecdsa_secp384r1_sha384),Nginx 需逐个匹配、校验、排序,增加 CPU 解析开销。用 ssl_conf_command 直接干预 OpenSSL 底层行为,可跳过冗余判断:
ssl_conf_command Curves X25519:secp256r1;
强制优先使用 X25519(椭圆曲线运算快、兼容性好),次选 secp256r1;排除 secp384r1/secp521r1 等高开销曲线。ssl_conf_command SignatureAlgorithms ecdsa_secp256r1_sha256:rsa_pss_rsae_sha256:rsa_pkcs1_sha256;
明确剔除 SHA-1 类(sha1)、弱填充(rsa_pkcs1_sha1)及冷门组合,减少 OpenSSL 在SSL_get_signature_nid()等调用中的遍历开销。
注意:该指令需 Nginx ≥ 1.19.4 + OpenSSL ≥ 1.1.1,且必须放在
ssl_certificate之后。
启用高效会话复用,避免完整握手
每次完整 TLS 握手(尤其是 RSA 或 DHE)需大量模幂/椭圆曲线运算。通过会话缓存 + TLS 1.3 PSK 复用,可将 CPU 密码计算降至接近零:
ssl_session_cache shared:SSL:20m;
共享内存缓存(1M ≈ 4000 会话),所有 worker 进程复用,避免为同一客户端重复生成主密钥。ssl_session_timeout 8h;
合理延长超时(非越长越好),平衡内存占用与复用率;短于 1h 容易导致频繁重握手。ssl_early_data off;(配合ssl_conf_command Options -AllowNoDHEKEX)
关闭 0-RTT 可减少一次密钥派生计算,同时规避重放风险;对 CPU 负载影响小但提升确定性。
精简 OCSP 验证链路,避免阻塞式 DNS 查询
OCSP Stapling 若配置不当(如 resolver 不可用、超时过长),会导致 worker 进程在握手阶段卡住等待 DNS 解析,间接抬高 CPU wait 和上下文切换:
resolver 1.1.1.1 8.8.8.8 valid=300s; resolver_timeout 3s;
使用低延迟公共 DNS,设短超时(≤3s),避免阻塞;valid=300s确保响应缓存 5 分钟,降低 OCSP 服务器压力。ssl_stapling on; ssl_stapling_verify on;
启用并强制验证 stapling 响应,防止客户端自行发起 OCSP 请求(更耗时、更不可控)。ssl_trusted_certificate /path/to/chain.pem;
显式指定可信 CA 链,避免 OpenSSL 在证书中逐级查找根证书,节省路径验证 CPU 时间。
控制缓冲区与协议版本,减少协议栈处理负担
较小的 TLS 记录层缓冲和严格的协议范围,能降低内核与用户态间数据拷贝及协议解析复杂度:
ssl_buffer_size 4k;
默认 16k 易造成首字节延迟(TTFB);设为 4k 可更快发出 ServerHello 和证书块,减少握手等待时间,间接缓解高并发下 worker 的调度压力。ssl_protocols TLSv1.2 TLSv1.3;
彻底禁用 TLS 1.0/1.1,避免 Nginx 在握手时兼容性检测逻辑(如ssl3_do_change_cipher_spec分支判断),精简协议状态机。
不复杂但容易忽略











