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