温馨提示×

Ubuntu Nginx SSL性能如何优化

小樊
40
2025-11-19 09:02:39
栏目: 云计算

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

一 基础与架构优化

  • 启用并优先使用 TLS 1.3,同时保留 TLS 1.2;禁用 SSLv3/TLS1.0/TLS1.1。TLS 1.3 握手更简洁、性能更好。
  • 使用支持前向保密(FS)的 ECDHE 套件,优先 AEAD 套件(如 AES-GCMChaCha20-Poly1305)。
  • 开启 HTTP/2HTTP/3(QUIC),多路复用显著降低连接与握手开销。
  • 打开 长连接(keepalive),让同一连接承载更多请求,减少频繁建连与握手。
  • 配置 SSL 会话复用:使用共享会话缓存与会话票据,降低完整握手次数。
  • 启用 OCSP Stapling,由服务器在握手时提供证书状态,减少客户端外链查询延迟。
  • 使用 HSTS 头,强制浏览器走 HTTPS,减少重定向与协商成本。
  • 证书与链要完整,私钥权限最小化(仅 root 可读)。

二 关键 Nginx 配置示例

# /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/ssl.conf
worker_processes auto;
events {
    worker_connections 4096;
    use epoll;                 # Linux 高效事件模型
    multi_accept on;
}

http {
    # 开启 Gzip(文本类资源收益明显)
    gzip on;
    gzip_vary on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    # SSL 会话复用(减少完整握手)
    ssl_session_cache shared:SSL:10m;   # 约可缓存 4000 个会话/MB
    ssl_session_timeout 1d;            # 可按并发与内存调优
    ssl_session_tickets on;            # 会话票据(TLS 1.2 及以下)

    # OCSP Stapling(需可解析 DNS)
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    resolver 1.1.1.1 8.8.8.8 valid=300s;
    resolver_timeout 5s;

    server {
        listen 443 ssl http2;
        server_name example.com;

        # 证书与链
        ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

        # 协议与套件(优先 AEAD + FS)
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:
                     ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:
                     ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
        ssl_prefer_server_ciphers on;

        # DH 参数(若证书非 ECDSA 或需兼容旧客户端)
        ssl_dhparam /etc/nginx/dhparam.pem;  # 生成:openssl dhparam -out /etc/nginx/dhparam.pem 2048

        # 安全与性能头
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
        add_header X-Frame-Options "SAMEORIGIN";
        add_header X-Content-Type-Options "nosniff";

        # 长连接(按需调整)
        keepalive_timeout 70;
        keepalive_requests 1000;

        location / {
            root /var/www/html;
            index index.html;
        }
    }

    # HTTP -> HTTPS 301 跳转
    server {
        listen 80;
        server_name example.com;
        return 301 https://$host$request_uri;
    }
}
  • 若需 HTTP/3(QUIC),在 Ubuntu 上可使用 nginx-quichecloudflared 等方案,或等待官方模块稳定发布后再启用。

三 证书与密钥优化

  • 优先使用 ECDSA 证书(如 prime256v1secp384r1),在同等安全下计算更快、握手更轻;如必须兼容旧客户端,可同时部署 RSA 证书并使用 SNI。
  • 生成 DH 参数(2048 位或更高)并配置 ssl_dhparam,避免每次握手重复生成。
  • 确保证书链完整(含中间证书),避免客户端额外往返验证。
  • 私钥文件权限设为 600,仅 root 可读;证书与密钥路径仅对必要进程可读。

四 系统与内核调优

  • 提高文件描述符限制:在 /etc/security/limits.conf 增加
    • nginx soft nofile 65535
    • nginx hard nofile 65535
      并在 systemd 服务中设置 LimitNOFILE=65535
  • 启用并优化内核网络参数(/etc/sysctl.conf):
    • net.core.somaxconn = 4096
    • net.ipv4.tcp_max_syn_backlog = 4096
    • net.ipv4.tcp_tw_reuse = 1
    • net.ipv4.tcp_fin_timeout = 30
    • net.ipv4.tcp_slow_start_after_idle = 0
    • net.core.netdev_budget_usecs = 20000
      执行 sysctl -p 生效。
  • 启用 TLS 硬件加速(如服务器 CPU 支持 AES-NI/AVX2):确保 OpenSSL 启用相关指令集,Nginx 会自动受益;无需额外指令。
  • 使用 CDN/边缘 TLS 终止:将握手与静态资源卸载到边缘节点,源站仅处理动态请求。

五 验证与压测

  • 协议与套件校验:
    • openssl s_client -connect example.com:443 -servername example.com -tls1_3
    • nmap --script ssl-enum-ciphers -p 443 example.com
  • 性能压测(逐步加压,观察握手耗时、P95/P99、QPS):
    • wrk -t12 -c400 -d30s https://example.com/
    • ab -n 10000 -c 100 https://example.com/
  • 在线检测:
    • SSL Labs SSL Server Test(评估协议、套件、OCSP、HSTS 等)
    • testssl.sh(本地全面检测)
  • 观察指标:
    • 握手耗时(TLS 1.2 vs 1.3)、会话复用率、OCSP Stapling 命中与时延、CPU 使用率与每秒握手数。

0