Nginx配置优化:轻松应对百万级并发请求

在高并发系统架构中,Nginx 常作为第一层流量入口。

因此,想要让 Nginx 稳定支撑百万级并发请求,核心在于对连接模型、内核参数、缓存优化@mikechen

Nginx并发配置

Nginx 最大连接数 ≈ worker_processes × worker_connections。

Nginx配置优化:轻松应对百万级并发请求-mikechen

例如 16 核 CPU,配置:

worker_processes  auto;
events {
    use epoll;
    worker_connections  100000;  # 每 worker 10 万
    multi_accept        on;
}

理论上就是:16 × 100000 = 160 万连接。

再考虑一点系统开销,百万级并发是“连接数量”层面可达的。

但你必须确保:内核允许这么多 fd(文件描述符)。

内存够:每连接几十 KB~数百 KB,100 万连接就是几 GB 级别。

 

Nginx全局 优化

在高并发场景下,Linux 内核默认的限制往往是瓶颈所在。

Nginx配置优化:轻松应对百万级并发请求-mikechen

我们需要调整网络连接的回收速度和文件句柄限制。

文件句柄数:这是基础,并发多少,句柄就要准备多少。

端口回收:加快 TIME_WAIT 状态连接的回收。

队列长度:增大半连接和全连接队列,防止瞬间流量冲垮系统。

# 核心优化建议
net.ipv4.tcp_tw_reuse = 1          # 允许将TIME-WAIT sockets重新用于新的TCP连接
net.ipv4.ip_local_port_range = 1024 65535 # 扩大临时端口范围
net.core.somaxconn = 65535         # 增大全连接队列
net.core.netdev_max_backlog = 65535 # 增大网卡积压队列
fs.file-max = 2097152              # 系统级文件句柄限制

 

缓存与静态化——把压力挡在前面

要“轻松”到百万并发,通常必须用缓存/静态资源,把 CPU 密集逻辑挡在后面。

Nginx配置优化:轻松应对百万级并发请求-mikechen

静态资源:直接由 Nginx 用 sendfile + 内核 page cache 输出。

动态内容:前面加 Nginx 缓存,后端只处理 MISS。

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=STATIC:1g
                 max_size=20g inactive=1h use_temp_path=off;

server {
    location /api/ {
        proxy_pass http://backend;

        proxy_cache           STATIC;
        proxy_cache_valid     200 302  10m;
        proxy_cache_valid     404      1m;
        proxy_cache_use_stale error timeout updating;
        add_header X-Cache $upstream_cache_status;
    }

    location /static/ {
        root /data/www;     # 静态文件目录
        expires 30d;
    }
}

 

 

HTTP / 反向代理层面关键配置

尽量让连接“轻”,减少每连接的工作量和内存占用。

Nginx配置优化:轻松应对百万级并发请求-mikechen

keepalive_timeout  60;       # 根据业务调;长连接越多,连接数越高
keepalive_requests 10000;    # 每个连接可复用的请求数量

client_body_timeout   10;
client_header_timeout 10;
send_timeout          10;

client_max_body_size  10m;

# 缓冲与队列(视内存调整)
client_body_buffer_size   64k;
client_header_buffer_size 4k;
large_client_header_buffers 4 16k;

# 日志可以适当精简,避免 IO 压力
access_log  /var/log/nginx/access.log  main  buffer=64k flush=1s;

}

评论交流
    说说你的看法