优化nginx https握手性能需三步:一是全局配置会话复用(shared缓存、延长timeout、启用ticket);二是升级tls 1.3并精简协议/曲线/签名/密码套件;三是启用ocsp stapling及反代上游ssl复用。

优化 Nginx 的 HTTPS 握手性能,核心是减少完整 TLS 握手次数、压低单次握手计算开销,并让复用机制真正跨进程生效。实测中,合理调优可将首屏延迟降低 300ms 以上,会话复用率提升至 90%+。
全局启用高效会话复用
每次完整握手都要做密钥交换(如 ECDHE 运算),CPU 消耗高、延迟大。复用已有会话可跳过这一步,耗时下降超 70%。
- 必须在 http 块顶层配置共享缓存:`ssl_session_cache shared:SSL:20m;`(写在 server 或 location 里无效,各 worker 无法共享)
- 延长复用有效期:`ssl_session_timeout 4h;`(默认 5 分钟太短,移动端切后台再唤醒基本错过窗口)
- 开启 session ticket 双保险:`ssl_session_tickets on;` + `ssl_session_ticket_key /etc/nginx/ssl/ticket.key;`(客户端存票据,服务端免查表,突发流量下更稳)
- 验证是否生效:用 `openssl s_client -connect example.com:443 -reconnect` 看输出是否频繁出现 Reused, SSL handshake succeeded;日志中加 `$ssl_session_reused` 统计,长期低于 60% 说明配置未起效或缓存不足
升级协议并精简协商路径
TLS 1.3 不仅更安全,握手从 2-RTT 缩减到 1-RTT(甚至支持 0-RTT),CPU 消耗比 TLS 1.2 低 30%~50%。但需配合精简参数,避免客户端发来大量冷门选项导致服务端空转匹配。
- 只启用现代协议:`ssl_protocols TLSv1.2 TLSv1.3;`(禁用 TLSv1.0/v1.1,它们既不安全又拖慢协商)
- 强制服务端主导协商:`ssl_prefer_server_ciphers on;`
- 限定高效椭圆曲线:`ssl_conf_command Curves X25519:secp256r1;`(剔除 secp384r1/secp521r1 等高开销曲线)
- 白名单签名算法:`ssl_conf_command SignatureAlgorithms ecdsa_secp256r1_sha256:rsa_pss_rsae_sha256:rsa_pkcs1_sha256;`(去掉所有 SHA-1 和弱填充组合)
- 聚焦 AEAD 密码套件:`ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;`(禁用 RC4、3DES、CBC 模式)
启用 OCSP Stapling 加速证书验证
传统方式下,客户端需直连 CA 查询证书吊销状态,常因 DNS 解析慢、网络抖动或 OCSP 服务器不可用而卡住握手。Nginx 主动获取并装订响应,可省掉 50%+ 验证延迟,且不暴露用户访问行为。
-
server 块内必须配置四项:
`ssl_stapling on;`
`ssl_stapling_verify on;`
`ssl_trusted_certificate /path/to/fullchain.pem;`(中间证书在前、根证书在后)
`resolver 8.8.8.8 1.1.1.1 223.5.5.5 valid=300s; resolver_timeout 5s;`(Nginx 不读 /etc/resolv.conf,必须显式指定)
反向代理场景下的 SSL 复用优化
当 Nginx 作为反代访问 HTTPS 后端(如 API 网关、SaaS 接口)时,上游连接也需复用,否则每条请求都触发新握手,延迟叠加严重。
-
proxy_ssl_session_reuse 必须放在 upstream 块内:
`upstream api_backend {
server api.example.com:443;
keepalive 64;
proxy_ssl_session_reuse on;
} -
配套三项不可少:
① `proxy_http_version 1.1; proxy_set_header Connection '';`(保活长连接)
② `upstream` 中 `keepalive 32;` 或更高(按 worker 并发峰值的 1.5–2 倍设)
③ `proxy_ssl_server_name on; proxy_ssl_name $host;`(透传 SNI,确保后端能正确匹配证书) - 协议与套件对齐后端:`proxy_ssl_protocols TLSv1.2 TLSv1.3;` + `proxy_ssl_ciphers "ECDHE-RSA-AES128-GCM-SHA256:..."`(任一不匹配即退化为完整握手)











