Nginx通过会话复用、TLSv1.3、异步私钥卸载及超时控制协同优化高频SSL握手:优先shared缓存与session ticket复用降频次,强制TLSv1.3精简协议,启用OpenSSL异步引擎卸载RSA/ECC运算,并设ssl_handshake_timeout防雪崩。

高频并发 SSL 握手带来的性能开销,本质是大量非对称加密运算(如 RSA 解密、ECC 签名)和 TLS 协议交互在单位时间内集中爆发。Nginx 本身不直接“加速”单次握手,而是通过减少握手次数、卸载计算压力、避免阻塞调度三类策略协同缓解 CPU 和延迟瓶颈。
优先启用会话复用,从源头降低握手频次
完整 TLS 握手是 CPU 最重的操作,而会话复用能跳过密钥交换与证书验证——这是最直接有效的降载方式。
-
必须使用 shared 缓存:写在
http { }块顶层,例如ssl_session_cache shared:SSL:50m;;若误写进server块,各 worker 无法共享,复用率趋近于零 -
超时时间按业务设:静态资源访问重连密集,设
ssl_session_timeout 5m更合理;WSS 或长连接 API 可设10m,但缓存容量需同步加大(每秒新建会话 × 超时秒数 ≈ 所需内存 MB) -
启用并轮换 session ticket:
ssl_session_tickets on;+ssl_session_ticket_key /path/to/ticket.key;它无状态、跨 worker/重启/机器,是 shared 缓存满后的关键兜底
选用轻量密码套件并强制 TLSv1.3
TLSv1.3 不仅协议更简(1-RTT/0-RTT),其内置套件(如 TLS_AES_128_GCM_SHA256)天然规避了高开销的 RSA 密钥交换和冗余签名验证。
-
明确启用 TLSv1.3:
ssl_protocols TLSv1.2 TLSv1.3;;OpenSSL ≥1.1.1 是硬性前提,旧版本无法生效 -
禁用 DHE 和大密钥 RSA:DHE 计算比 ECDHE 慢数倍;4096 位 RSA 私钥解密耗时是 2048 位的 4–8 倍;配置中应排除
DHE、!RSA(若用 ECDSA 证书)等组合 -
不手动指定 TLSv1.3 套件:该协议使用独立精简列表,旧
ssl_ciphers配置对其无效;保留即可,避免干扰
异步卸载私钥运算与硬件协同
当 handshake 请求持续涌入,私钥操作(如证书签名、pre-master secret 解密)会成为单 worker 的串行瓶颈。启用 OpenSSL 异步引擎可将其移交线程池或硬件队列处理。
-
确认 OpenSSL 支持异步:编译 Nginx 时需链接 OpenSSL ≥1.1.1 且开启
enable-async;运行时检查openssl version -a | grep async -
加载硬件加速引擎(如适用):Intel QAT、ARM SVE 加密扩展等;配置示例:
ssl_engine qat;或 OpenSSL 3.0+ 的ssl_conf_command Providers "qat,base"; -
软件异步兜底:无硬件时,可启用 OpenSSL 自带线程池,配合
ssl_buffer_size 4096减少加密调用频次,缓解上下文切换压力
控制握手等待边界,防雪崩式资源耗尽
慢速或异常客户端可能让 handshake 长期挂起,占用 worker 连接槽位。ssl_handshake_timeout 是防止资源被拖死的最后一道闸门。
- 公网服务建议设为 5s–8s:覆盖 99.7% 正常握手(TLSv1.3 平均
- 内网可信链路可放宽至 10s:但需搭配健康检查与熔断机制,避免单点故障扩散
- 绝对禁用 0 或 >15s:Nginx 官方明确警告,过长等待将显著降低并发处理能力,突发流量下易引发连接队列积压与超时级联



















