nginx https握手延迟优化需协同协议、缓存与调度:启用tls 1.3并精简ecdhe+aead密码套件;配置共享ssl_session_cache与session tickets双复用机制;结合ocsp stapling加速证书验证;改用least_conn等动态负载策略替代ip_hash。

Nginx 的 HTTPS 握手延迟主要卡在 TLS 协商、证书验证和密钥计算三个环节。优化不是堆资源,而是让协议能力、缓存机制和系统调度协同起来——重点是减少完整握手次数、缩短单次协商路径、避免外部阻塞。
启用 TLS 1.3 并精简密码套件
TLS 1.3 把握手从 2-RTT 压到 1-RTT,CPU 开销比 TLS 1.2 低 30%~50%。必须确保 Nginx ≥ 1.13.0、OpenSSL ≥ 1.1.1。
- 在
http或server块中写:ssl_protocols TLSv1.2 TLSv1.3;(禁用 TLSv1.0/1.1) - 密码套件聚焦高效组合:
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305'; - 加上
ssl_prefer_server_ciphers on;,让服务端主导协商结果 - 还可进一步限定曲线和签名算法,降低匹配开销:
ssl_conf_command Curves X25519:secp256r1;ssl_conf_command SignatureAlgorithms ecdsa_secp256r1_sha256:rsa_pss_rsae_sha256:rsa_pkcs1_sha256;
强制双会话复用机制
每次完整握手都要做椭圆曲线运算,复用能跳过这步,耗时降 70% 以上。关键在“共享”和“双保险”:
- 在
http块顶层配共享缓存:ssl_session_cache shared:SSL:10m;(不能写在server里) - 超时设为 10–20 分钟:
ssl_session_timeout 10m;(默认 5 分钟太短,移动端易失效) - 开启 Session Tickets:
ssl_session_tickets on;,并定期轮换密钥:ssl_session_ticket_key /etc/nginx/ticket.key; - 若后端也走 HTTPS(如微服务代理),加:
proxy_ssl_session_reuse on;
开启 OCSP Stapling 加速证书验证
客户端直连 CA 查吊销状态,常因 DNS、网络或防火墙卡住,拖慢 150–300ms。Nginx 主动装订响应就能绕过这步:
- 四项配置缺一不可,全写在
server块内(443 监听下):ssl_stapling on;ssl_stapling_verify on;ssl_trusted_certificate /path/to/full-chain-trusted.pem;(中间 CA + 根 CA 拼接,不含域名证书)resolver 8.8.8.8 1.1.1.1 valid=300s; resolver_timeout 5s; - 注意:证书必须含
Authority Information Access扩展,服务器时间误差不能超 ±5 分钟
调整负载策略匹配 SSL 特性ip_hash 会把同一客户端长期绑死一个后端,导致复用请求扎堆,局部 CPU 热点。改用动态策略更合理:
- 用
least_conn或hash $remote_addr consistent;替代ip_hash - 如果用
upstream做后端集群,确保各节点都启用上述 TLS 和复用配置,避免不一致
不复杂但容易忽略:这些配置要一起生效才有明显效果。单独调某一项,提升有限;组合落地后,实测首次握手延迟可压到 100ms 内,复用连接基本接近 HTTP 延迟。











