Nginx 启用 SSL证书后性能下降,根本原因在于 TLS/SSL 握手过程中高强度的非对称加密运算。一个 Nginx 工作进程每秒可能只能处理几百次完整的 TLS 握手,却能处理数万次普通 HTTP 请求。
要有效缓解这一问题,核心在于 减少不必要的完整握手。而 `ssl_session_cache`(会话缓存)和 `OCSP Stapling` 正是实现这一目标的两项关键优化技术。
一、性能下降的根源:TLS 握手
启用 HTTPS 后,除了 TCP 三次握手,还需进行 TLS 握手。这个过程涉及证书校验、密钥交换等复杂计算,其耗时可能占整个 HTTPS 连接耗时的 60% 以上。对于每个新访客,这个完整的握手流程都必须执行一次,在高并发下会迅速耗尽 CPU 资源。
二、优化一:会话缓存 (ssl_session_cache)
会话缓存通过复用之前的会话信息,让重复访问的客户端跳过完整的 TLS 握手,从而大幅降低 CPU 和延迟开销。
配置示例:在 `http` 或 `server` 块中添加以下配置:
```nginx
ssl_session_cache shared:SSL:10m; # 分配10MB共享内存,约可存储4000个会话/MB
ssl_session_timeout 4h; # 会话超时时间,建议4小时
ssl_session_tickets on; # 启用 Session Tickets 作为补充
```
性能收益:
降低延迟:会话复用可减少一个完整的往返时间(RTT),效率可提升约 40%。
降低 CPU 负载:避免重复的非对称加密解密运算。
缓存大小估算:缓存大小需根据业务量估算。公式为:`所需MB数 = (每秒新建会话数 * 会话超时秒数) / 4000`。
注意事项:
务必使用 `shared` 类型缓存,以便所有 Nginx 工作进程共享。
`ssl_session_tickets` 在 TLS 1.3 下是必须的,建议保持开启。
三、优化二:OCSP Stapling
OCSP Stapling 能让 Nginx 预先从证书颁发机构(CA)获取证书状态,并在 TLS 握手时直接“订书机式地”将这份已签名的状态证明发送给客户端。这避免了每个客户端都去查询 CA 造成的延迟和隐私泄露。
配置示例:在 `server` 块中添加:
```nginx
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /path/to/fullchain.pem; # 必须包含完整的证书链
resolver 1.1.1.1 8.8.8.8 valid=300s; # 指定DNS服务器
resolver_timeout 5s;
```
性能收益:可消除客户端 100-500ms 的额外查询延迟。
四、更多优化组合拳
启用 TLS 1.3:将握手往返时间(RTT)从 2 次减少到 1 次。
开启 HTTP/2:利用多路复用减少连接数,降低握手总次数。
优化密码套件:优先使用 ECDHE 等支持前向保密且高效的算法。
启用硬件加速:确保 CPU 的 AES-NI 指令集被充分利用。
五、验证与监控
验证配置:修改配置后,运行 `sudo nginx -t` 测试语法,然后 `sudo systemctl reload nginx` 重载。
监控命中率:在 Nginx 日志格式中添加 `$ssl_session_reused` 变量。该变量值为 `"r"` 表示会话复用,`"."` 表示完整握手。生产环境中的会话复用命中率应争取达到 90% 以上。
验证 OCSP Stapling:使用 `openssl s_client -connect your-domain.com:443 -status` 命令,检查输出中是否包含 OCSP 响应信息。
通过合理配置 `ssl_session_cache` 和 `OCSP Stapling`,并辅以其他优化手段,可以有效地将 TLS 的性能损耗降至最低,让 HTTPS 在提供安全性的同时,也能拥有媲美 HTTP 的访问速度。