HTTPS握手开销优化核心是协议升级、会话复用与负载策略协同:启用TLS 1.3并精简为ECDHE+AEAD密码套件;配置共享ssl_session_cache与Session Tickets双复用机制;结合OCSP Stapling加速证书验证;改用least_conn等动态负载策略替代ip_hash,确保复用请求均衡分布。

HTTPS 握手开销主要来自 TLS 协商过程中的密钥交换、证书验证和加密计算,Nginx 作为负载均衡器,既承担 SSL 终止职责,又负责请求分发。优化关键不是堆硬件,而是让协议能力、缓存机制与负载策略相互适配。
启用 TLS 1.3 并精简密码套件
TLS 1.3 将握手从 2-RTT 缩减为 1-RTT(甚至 0-RTT),大幅降低延迟。它默认禁用不安全算法,也天然规避 RSA 密钥交换的高 CPU 消耗。
- 在
http或server块中明确启用:ssl_protocols TLSv1.3;(如需兼容旧客户端,可加 TLSv1.2,但避免 TLSv1.0/1.1) - 优先选用 ECDHE+AEAD 组合,例如:
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384'; - 设置
ssl_prefer_server_ciphers on;确保服务端主导协商结果
强制双会话复用机制
重复连接若每次都走完整握手,CPU 负载会随并发线性上升。必须同时启用服务端缓存 + 客户端票据,形成冗余保障。
- 在
http块顶层配置共享缓存:ssl_session_cache shared:SSL:10m;(10m ≈ 4 万个会话,日均百万请求够用;高并发可扩至 20m) - 设合理超时:
ssl_session_timeout 10m;(太短易失效,太长占内存;金融类建议 5–10m) - 开启 Session Tickets:
ssl_session_tickets on;,并定期轮换密钥:ssl_session_ticket_key /etc/nginx/ticket.key; - 若后端也走 HTTPS(如微服务间代理),还需加:
proxy_ssl_session_reuse on;
配合 OCSP Stapling 与证书链优化
客户端验证证书时若直连第三方 OCSP 服务器,会引入额外 DNS 查询与网络延迟,甚至因超时导致握手阻塞。Nginx 主动“装订”响应,可将验证耗时压缩 50% 以上。
- 启用 stapling:
ssl_stapling on;和ssl_stapling_verify on; - 指定可信根证书路径:
ssl_trusted_certificate /path/to/fullchain.pem;(注意:不是仅放域名证书,要含中间 CA) - 配置 DNS 解析器(避免依赖系统 resolver):
resolver 8.8.8.8 1.1.1.1 valid=300s;,并设resolver_timeout 5s;
调整负载策略以匹配 SSL 特性
传统 ip_hash 会把同一客户端长期绑定到固定后端,看似稳定,实则破坏了会话复用的分布均衡性——大量复用请求集中在少数 worker 或后端节点,造成局部 CPU 热点。
- 改用
least_conn,结合 keepalive 连接复用:proxy_http_version 1.1; proxy_set_header Connection ''; - 上游 server 配置 keepalive 连接池:
keepalive 32;(数值按后端处理能力调,通常 16–64) - 如需更高一致性,可用
hash $ssl_session_id consistent;或基于票据哈希分流,而非 IP - 进阶场景可考虑解耦:前端 Nginx 专注 SSL 终止与会话管理,后端用轻量反向代理(如 Envoy)处理业务路由
不复杂但容易忽略:所有 ssl_* 缓存与协议配置必须放在 http 块顶层,否则多个 worker 进程无法共享状态,复用率趋近于零。验证是否生效,靠 openssl s_client -connect domain:443 -reconnect 看 Reused 出现频率,再结合 Nginx 日志里的 $ssl_session_reused 变量统计比例。


















