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  的访问速度。