优化nginx ssl握手性能的关键是减少完整握手次数,需启用tls 1.3、配置全局共享会话缓存(ssl_session_cache shared:ssl:10m)、开启session tickets、启用ocsp stapling,并在代理https后端时设置proxy_ssl_session_reuse on。

优化 Nginx 的 SSL 握手性能,关键不是堆 CPU 或升级硬件,而是让大多数连接跳过完整握手——靠协议精简、缓存共享和复用兜底。核心目标就一个:把 2–3 RTT 的完整握手,压到 1 RTT 甚至 0-RTT(TLS 1.3 下),同时确保复用机制在高并发、多 worker 场景下真正生效。
启用 TLS 1.3 并收紧密码套件
TLS 1.3 握手天然只需 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 'TLS13-AES-128-GCM-SHA256:TLS13-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-CHACHA20-POLY1305';-
ssl_prefer_server_ciphers on;(TLS 1.3 下被忽略,但保留可兼容旧 OpenSSL) - 可选精简协商开销:
ssl_conf_command Curves X25519:secp256r1;和ssl_conf_command SignatureAlgorithms ecdsa_secp256r1_sha256:rsa_pss_rsae_sha256;
配置全局 SSL 会话缓存与合理超时
会话复用失效,90% 的优化都白做。缓存必须跨 worker 共享,且超时要匹配真实访问节奏:
- 在 http 块最顶层写:
ssl_session_cache shared:SSL:10m;(10MB 约存 4 万个会话;高流量可设 20m) -
ssl_session_timeout 10m;是普通站点较优平衡点;内网 API 网关等可信环境可设4h;;金融类建议 5m–10m - 务必搭配
ssl_session_tickets on;,服务端压力更小,对 TLS 1.3 自动适配;高安全场景加ssl_session_ticket_key /etc/nginx/ticket.key;并定期轮换
反向代理 HTTPS 后端时启用连接复用
若 Nginx 作为网关代理到 HTTPS 后端(如微服务、云 API),需单独开启后端连接复用,否则每次 upstream 请求都重握手:
- 必须放在 upstream 块内:
proxy_ssl_session_reuse on; - 配套三项不可少:
✓proxy_http_version 1.1;+proxy_set_header Connection '';
✓keepalive 32;(按单 worker 并发峰值的 1.5–2 倍估算)
✓ 若后端多域名或需 SNI(如泛域名证书、mTLS),加proxy_ssl_server_name on;和proxy_ssl_name $host;
启用 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 1.1.1.1 8.8.8.8 valid=300s; resolver_timeout 2s;
不复杂但容易忽略:所有配置生效的前提是客户端支持(现代浏览器基本都 OK),且不能被中间设备(如老旧 WAF、透明代理)剥离 SNI 或 stapling 响应。上线后务必用 openssl s_client -connect example.com:443 -reconnect 观察 Reused 出现频次,再结合日志变量 $ssl_session_reused 统计真实复用率。











