Nginx 高并发调优:从内核参数到反向代理的完整清单

上周线上服务经历了一次短暂的流量突增,接口响应时间从正常的 40ms 飙升到 1.5s。排查下来,问题不在应用层,而在 Nginx 和内核的一些默认配置没有跟上并发规模。整理了一份完整的调优清单,分享出来。

1. Worker 进程与连接数

首先确认 worker 进程数是否等于 CPU 核数。可以通过 worker_processes auto; 让 Nginx 自动匹配,不必手动写死。

worker_processes auto;
events {
    worker_connections 65535;
    multi_accept on;
}

multi_accept on 让每个 worker 在一次事件循环里尽量多地 accept 新连接,能明显降低高并发下的握手延迟。

2. keepalive 与连接复用

短连接在高并发下会造成大量 TCP 三次握手的开销。开启 keepalive 并适当延长超时:

keepalive_timeout 65;
keepalive_requests 1000;

如果 Nginx 是作为反向代理,还得开启对上游的 keepalive 连接池:

upstream backend {
    server 127.0.0.1:8080;
    keepalive 128;
}
server {
    location / {
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_pass http://backend;
    }
}

3. sendfile 与文件传输

静态文件传输务必开启 sendfile,并配合 tcp_nopush 减少网络包数量:

sendfile on;
tcp_nopush on;
tcp_nodelay on;

4. 内核参数

这部分是很多人忽略的。修改 /etc/sysctl.conf

net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15

执行 sysctl -p 使其生效。tcp_tw_reuse 允许复用 TIME_WAIT 状态的连接,对短连接场景帮助很大。

5. 文件描述符上限

默认的 ulimit -n 通常是 1024,高并发下会直接报错。在 /etc/systemd/system/nginx.service 中添加:

[Service]
LimitNOFILE=65535

小结

调优是一个系统工程,不能只盯着某一项。以上每一项单独来看提升有限,但组合起来,能让同一台机器扛住数倍的并发。更重要的是,先通过压测定位真正的瓶颈,再对症下药。