Nginx 并发调优:worker 进程与连接数怎么算
发布时间:2026-08-25 22:55       
更新时间:2026-08-26 18:58
一台 Nginx 到底能扛多少并发,不是玄学,是能算出来的:最大连接数约等于 worker_processes 乘以 worker_connections。公式之外,文件描述符、内存、CPU 都可能先一步成为瓶颈,这篇把几个参数的算法和调法讲清。
一、worker 进程数
```
worker_processes auto;
```
worker 是真正处理请求的进程,auto 按核数起,多数情况不用手工指定。确实要绑核时:
```
worker_cpu_affinity auto;
```
每个 worker 固定在一个核上,减少核间调度,多核大流量机器收益更明显。worker 数超过核数没有好处,反而增加切换开销。
二、连接数与两个约束
```
events {
worker_connections 10240;
}
```
单个 worker 能同时持有的连接数由它决定,乘以 worker 数就是理论上限。注意两点:
- 反向代理场景,对客户端一个请求要对上游再占一个连接,实际承载按一半估算。
- 系统层面的文件描述符必须同步放大:nginx.conf 里加 worker_rlimit_nofile 20480,系统层把 ulimit -n 写进 /etc/security/limits.conf,或 systemd 服务的 LimitNOFILE=20480。否则并发一高就报 too many open files。
内存方面,空闲连接的开销约几百字节,加上缓冲区,一万并发通常几十 MB 量级,内存很少是先到的那个瓶颈。worker_connections 也不是越大越好,设到十万八万除了自我安慰没有用处,每个连接都占着文件描述符与内存,按压测结果定档即可。多核机器还要留意网卡软中断的分布:中断集中在一个核上时,worker 绑核的收益会大打折扣。
三、keepalive 别忽略
```
keepalive_timeout 30s;
keepalive_requests 1000;
```
短连接会让 TIME_WAIT 堆积,高并发下本地端口耗尽比连接数超限更常见。反代到上游时在 upstream 里配 keepalive 32,并加 proxy_set_header Connection "";,让到后端的连接复用。
四、压测验证
参数改完用 wrk 压一把:
```
wrk -t4 -c1000 -d30s https://example.com/
```
关注两个指标:非 2xx/3xx 响应的数量、延迟分布。同时开 top -H 看 CPU 是否单核打满(打满说明负载没摊开),ss -s 看连接总量与 TIME_WAIT 数。压测安排在业务低峰,流量能走内网就走内网,公网压测既花钱又惊动监控。调优结论必须来自压测数字,改一个参数测一轮,每次只动一处,否则说不清是谁的功劳。