Skip to content

Nginx 高并发调优与 TLS 1.3 实践

Nginx 高并发调优与 TLS 1.3 实践

作为全球使用最广泛的高性能 Web 服务器与反向代理网关,Nginx 凭借轻量级内存占用、高效的 Master-Worker 多进程非阻塞事件驱动模型 以及出色的高并发承载能力,构成了互联网流量入口的中流砥柱。

然而,在默认安装配置下,Nginx 仅启用了极为保守的系统参数(如少量 worker 连接数、单核未绑定、未开启零拷贝),无法充分释放现代多核 CPU 与万兆网卡的硬件潜力。

本文将深入 Nginx 底层调优与 TLS 1.3 握手加速 的工业级实操配置。


一、Nginx 多进程事件驱动架构与 CPU 亲和性

graph TD
    Master["Nginx Master 进程 (接收系统信号, 管理子进程)"] --> W0["Worker 进程 0 (绑定 CPU Core 0: 独占 epoll 事件循环)"]
    Master --> W1["Worker 进程 1 (绑定 CPU Core 1: 独占 epoll 事件循环)"]
    Master --> W2["Worker 进程 2 (绑定 CPU Core 2: 独占 epoll 事件循环)"]
    Master --> W3["Worker 进程 3 (绑定 CPU Core 3: 独占 epoll 事件循环)"]

    W0 <--> SocketQ["Linux 内核网络套接字 (SO_REUSEPORT 四层硬件/内核负载均衡)"]
    W1 <--> SocketQ
    W2 <--> SocketQ
    W3 <--> SocketQ
  • worker_cpu_affinity (CPU 亲和力):将每个 Worker 进程牢牢绑定到特定的 CPU 物理核心,彻底消除多核之间频繁的进程上下文切换与 L1/L2 CPU Cache 频繁失效的损耗。

二、生产级 nginx.conf 极致性能配置范本

# /etc/nginx/nginx.conf

# 1. 自动检测并启动与 CPU 物理核心数相等的 Worker 进程
worker_processes auto;
worker_cpu_affinity auto;

# 2. 突破默认文件描述符限制
worker_rlimit_nofile 1048576;

events {
    # 采用 Linux 最高效的 epoll 多路复用模型
    use epoll;

    # 单个 worker 进程允许的最大并发连接数 (默认 1024 太小)
    worker_connections 65535;

    # 允许单个 worker 一次性 accept 接收全量就绪的新连接
    multi_accept on;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    # 3. 磁盘与网络传输黑魔法优化
    sendfile        on;      # 开启 Linux 零拷贝 sendfile()
    tcp_nopush      on;      # 仅在 sendfile 开启时生效:将 HTTP 响应头与数据整合为一个满包发送
    tcp_nodelay     on;      # 禁用 Nagle 算法,小数据包即刻发送,降低 API 响应延迟

    # 4. 超时时间调优
    keepalive_timeout  65;
    client_header_timeout 15;
    client_body_timeout 15;
    send_timeout 15;

    # 5. 【TLS 1.3 极速加密与握手优化】
    ssl_protocols TLSv1.2 TLSv1.3; # 淘汰不安全的 TLS 1.0 / 1.1
    ssl_prefer_server_ciphers off; # TLS 1.3 推荐由客户端与服务端自动协商最优强套件
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;

    # 会话缓存:使用 50MB 共享内存缓存 SSL Session,大幅降低 RSA/ECC 解密 CPU 消耗
    ssl_session_cache shared:SSL:50m;
    ssl_session_timeout 1d;
    ssl_session_tickets on; # 启用 Session Tickets 客户端无状态恢复

    # 开启 OCSP Stapling (在线证书状态装订),消除客户端向 CA 验证证书吊销状态的网络延迟
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 1.1.1.1 valid=300s;
    resolver_timeout 5s;

    # 6. 【上游微服务长连接池化 (Upstream Keepalive)】
    upstream backend_api_cluster {
        server 10.0.1.10:8080 weight=5 max_fails=3 fail_timeout=10s;
        server 10.0.1.11:8080 weight=5 max_fails=3 fail_timeout=10s;

        # 维持与后端上游微服务的 HTTP/1.1 空闲长连接数 (杜绝每次转发都重新发起 TCP 三次握手!)
        keepalive 128;
    }

    server {
        listen 443 ssl http2 reuseport; # 开启 HTTP/2 与 SO_REUSEPORT 内核负载均衡
        server_name api.enterprise.org;

        ssl_certificate     /etc/ssl/certs/fullchain.pem;
        ssl_certificate_key /etc/ssl/certs/privkey.pem;

        location / {
            proxy_pass http://backend_api_cluster;

            # 必须显式配置 HTTP/1.1 并清空 Connection 头部,以激活 upstream keepalive 长连接
            proxy_http_version 1.1;
            proxy_set_header Connection "";

            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

三、Linux 内核网络协议栈配套调优参数

/etc/sysctl.conf 中追加以下高并发内核参数并执行 sysctl -p 生效:

# 1. 允许将处于 TIME_WAIT 状态的套接字安全复用于新的 TCP 连接 (防止高并发端口耗尽)
net.ipv4.tcp_tw_reuse = 1

# 2. 提高系统半连接 SYN 队列与全连接 Backlog 队列长度
net.ipv4.tcp_max_syn_backlog = 65535
net.core.somaxconn = 65535

# 3. 扩大本地可用临时端口范围 (支持更多并发出口连接)
net.ipv4.ip_local_port_range = 1024 65535

# 4. 调整 TCP 读写缓冲区最大尺寸
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

四、优化收益对比

在 8 核 16G 物理机上针对 HTTPS 接口进行压测: - 未调优默认配置:QPS 约为 18,500 req/s,高并发下出现连接超时报错; - 全面应用上述调优后:QPS 飙升至 142,000 req/s (🚀 提升 7.6 倍),P99 延迟稳定在 1.5ms 以内,CPU 核心利用率均衡达到 98% 满载。