温馨提示×

如何优化centos nginx ssl性能

小樊
48
2026-01-07 23:44:50
栏目: 云计算

CentOS 上 Nginx SSL 性能优化实操指南

一 基础与协议套件

  • 仅启用现代协议:优先使用 TLSv1.3,如需兼容旧客户端可同时开启 TLSv1.2;禁用 SSLv3/TLSv1.0/TLSv1.1
  • 选择 AEAD 套件并优先服务器端顺序:推荐 ECDHE-ECDSA/ RSA-AES128/256-GCM-SHA256ECDHE-ECDSA/ RSA-CHACHA20-POLY1305;设置 ssl_prefer_server_ciphers on
  • 启用 HTTP/2 提升并发与首包时间:listen 443 时使用 listen 443 ssl http2
  • 证书链完整:使用 fullchain 作为 ssl_certificate,必要时配置 ssl_trusted_certificate 供 OCSP 装订与校验。
  • 示例片段:
    listen 443 ssl http2;
    ssl_certificate     /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;
    ssl_trusted_certificate /etc/nginx/ssl/chain.pem;  # 可选,用于 OCSP 装订校验
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:
                       ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:
                       ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
    ssl_prefer_server_ciphers on;
    
    以上做法可显著降低握手往返与 CPU 消耗,并提升兼容性与安全基线。

二 握手与会话复用

  • 开启共享会话缓存:使用 shared 类型在所有 worker 间共享,典型 10–50m;经验值 1MB≈4000 会话
  • 合理会话超时:如 10m–1d,在并发与内存间平衡。
  • 会话票据 Session Tickets:单实例可开启 ssl_session_tickets on;多实例/多节点建议关闭并改为共享缓存,或用 ssl_session_ticket_key 统一密钥并定期轮换,避免单点密钥导致会话不可用。
  • 示例片段:
    ssl_session_cache   shared:SSL:50m;   # 约可缓存 20万+ 会话
    ssl_session_timeout 1d;
    # 多节点建议:
    # ssl_session_tickets off;
    # ssl_session_ticket_key /etc/nginx/ssl/ticket_key;  # 多节点统一并定期轮换
    
    会话复用可显著减少完整握手次数,降低 RTTCPU

三 证书与握手加速

  • OCSP Stapling:在源站预取并装订 OCSP 响应,避免客户端外连 CA,缩短握手验证时间。
    示例:
    ssl_stapling         on;
    ssl_stapling_verify  on;
    ssl_trusted_certificate /etc/nginx/ssl/chain.pem;
    resolver             8.8.8.8 1.1.1.1 valid=300s;
    resolver_timeout     5s;
    
  • DH 参数:为 ECDHE 提供安全的 DH 参数文件(PFS),建议预生成并复用。
    生成与配置:
    openssl dhparam -out /etc/nginx/dhparam.pem 2048
    # 在 server 块:
    ssl_dhparam /etc/nginx/dhparam.pem;
    
  • HSTS:减少协议降级与重定向开销。
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
    
  • 0-RTT(可选):在 TLSv1.3 且业务允许的前提下启用 ssl_early_data on;,注意重放风险与幂等性设计。

四 连接与架构层优化

  • 长连接与上游复用:提升连接复用率,降低握手与建连开销。
    keepalive_timeout 65s;
    keepalive_requests 1000;
    
    upstream backend {
      zone backend 64k;
      server 10.0.0.10:8443;
      keepalive 32;
    }
    
  • 压缩与内容分发:启用 gzipBrotli(需模块),并尽量使用 CDN/边缘 TLS 卸载与缓存静态资源。
  • 四层 TCP/SSL 代理(如 TLS 透传):在 stream { … } 中使用 ssl_certificate/ssl_certificate_key/ssl_protocols/ssl_ciphers/ssl_session_cache 等指令;注意编译时启用 –with-stream --with-stream_ssl_module
  • 示例(stream):
    stream {
      server {
        listen 443 ssl;
        ssl_certificate     /path/to/cert.pem;
        ssl_certificate_key /path/to/key.pem;
        ssl_protocols       TLSv1.2 TLSv1.3;
        ssl_ciphers         EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;
        ssl_session_cache   shared:SSL:10m;
        ssl_session_timeout 10m;
        proxy_pass backend:8443;
      }
    }
    
    连接与架构层优化能减少握手次数、提升并发与整体吞吐。

五 系统与 OpenSSL 层优化

  • 启用 CPU 加密加速:确保 OpenSSL 启用 AES-NI/NEON/SIMD 等优化;错误的编译或静态链接会导致性能骤降。
  • 验证与选型:使用 openssl speed 对比 AES-GCM/CHACHA20RSA/ECDSA 吞吐;必要时测试 RSA 2048 与 4096 位 性能差异并选择平衡点。
  • 引擎与硬件加速:在具备 QAT/SSL 加速卡 时,可按引擎配置(如 ssl_engine qat;),并评估 0-RTT 场景收益与风险。
  • 系统资源与事件模型:将 worker_processes 设为 CPU 核心数,worker_connections 结合并发目标调整;Linux 优先使用 epoll
  • 快速自检清单:
    • 协议与套件:
      openssl s_client -connect example.com:443 -servername example.com -alpn h2,http/1.1
      
    • HTTP/2 验证:
      curl -I --http2 https://example.com
      
    • 性能基线:
      openssl speed -evp aes-128-gcm -seconds 5
      openssl speed -evp chacha20-poly1305 -seconds 5
      
    系统与 OpenSSL 层优化可释放硬件潜力、降低握手与加解密延迟。

0