温馨提示×

如何优化ubuntu nginx的ssl性能

小樊
42
2025-12-26 18:34:19
栏目: 云计算

Ubuntu 上 Nginx SSL 性能优化实操

一 基础与架构优化

  • 启用并优先使用 TLS 1.3,同时保留 TLS 1.2;禁用 SSLv3/TLS1.0/TLS1.1。优先选择支持前向保密(FS)的 ECDHE 套件,并优先 AEAD 套件(如 AES-GCM、ChaCha20-Poly1305)。
  • 开启 HTTP/2(多路复用显著降低连接与握手开销);在具备条件时评估 HTTP/3/QUIC(如 nginx-quicheCloudflared 边缘方案)。
  • 打开 长连接 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;
    multi_accept on;
}

http {
    # 文本资源压缩
    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
    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;

        # 证书与链(确保 fullchain 包含中间证书)
        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 参数(RSA 证书或需兼容旧客户端时配置)
        ssl_ecdh_curve X25519:secp384r1;
        ssl_dhparam /etc/nginx/dhparam.pem;  # 生成:openssl dhparam -out /etc/nginx/dhparam.pem 2048

        # 首包优化(减少 TLS 记录大小,降低首包延迟)
        ssl_buffer_size 4k;

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

        # 长连接(按并发与 RTT 调整)
        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;
    }
}
  • 证书与密钥优化:优先 ECDSA 证书(如 prime256v1/secp384r1),在同等安全下计算更快;如必须兼容旧客户端,可同时部署 RSA 证书并使用 SNI
  • 生成 DH 参数:openssl dhparam -out /etc/nginx/dhparam.pem 2048(或 4096,首次生成较慢,建议离线生成并定期轮换)。
  • 若启用 TLS 1.3 0-RTT(ssl_early_data on;),请评估重放攻击风险后再开启。

三 系统与内核调优

  • 文件描述符限制:在 /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
      执行 sysctl -p 生效。
  • 启用 AES-NI/AVX2 等硬件加速(现代 CPU 通常默认启用,Nginx/OpenSSL 会自动受益)。
  • 使用 CDN/边缘 TLS 终止:将握手与静态资源卸载到边缘节点,源站仅处理动态请求。

四 验证与压测

  • 配置语法与重载:sudo nginx -t && sudo systemctl reload nginx
  • 协议与套件校验:
    • 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 使用率与每秒握手数

五 证书与续期自动化

  • 使用 Certbot 获取/续期 Let’s Encrypt 证书:
    • 安装:sudo apt update && sudo apt install certbot python3-certbot-nginx
    • 申请:sudo certbot --nginx -d example.com -d www.example.com
  • 自动续期(证书有效期 < 30 天自动续签):
    • 定时任务:0 3 * * * certbot renew --quiet --post-hook "systemctl reload nginx"
  • 证书路径通常为 /etc/letsencrypt/live/example.com/(含 fullchain.pemprivkey.pem)。

0