一次压测过程中,客户端连续报出connection reset by peer,Nginx错误日志却只有少量记录,这种前端拒绝、后端空闲的组合多数指向events块里的worker_connections配置过小。worker_connections决定每个worker进程能够同时打开的连接数量上限,它不像worker_processes那样直观,却直接决定了Nginx在突发流量下能否及时接纳新的TCP连接。很多连接失败并不是后端处理不过来,而是连接还没进入应用层就被丢弃了。

要理解这个问题,需要先分清两个概念:并发连接数和每秒请求数。worker_connections管的是连接数,不是QPS。一个慢请求可能长时间占着一个连接,而连接数达到上限后,即使后端服务器很空闲,新的连接也无法被接受。下面从配置原理、故障定位、系统调优和验证方法四个角度展开。
worker_connections到底控制什么
在Nginx的events块中,worker_connections表示每个worker进程可以同时处理的最大连接数。它不是全局总连接数,而是单进程上限。例如配置为1024,并且worker_processes为4,理论上总连接数约为4096。但实际还要扣除Nginx自身使用的连接,比如与上游服务器通信、日志写入、DNS解析等场景可能会占用额外连接。
一个常见误区是认为worker_connections只统计客户端连接。事实上,如果Nginx作为反向代理,一个客户端请求通常会占用两个连接:一个是客户端到Nginx的连接,另一个是Nginx到上游服务器的连接。也就是说,在反向代理场景下,实际能承载的客户端连接数大约只有worker_connections的一半。配置如下:
events {
worker_connections 1024;
}
上述配置中,如果Nginx同时作为静态资源服务器,连接基本是一对一的;但作为代理时,很快就会感到连接不够用。另一个误区是把worker_connections误认为可以无限调大,实际上它受操作系统文件描述符限制和内存大小约束。每个连接都会占用一定内存,盲目调大可能导致Nginx启动失败,或者在高负载下触发OOM。
连接不足的典型现象与定位方法
当worker_connections耗尽时,Nginx的行为比较隐蔽。客户端可能看到连接超时、connection reset by peer,或者浏览器一直转圈。Nginx错误日志里不一定有明确提示,有时只会出现类似accept() failed的底层错误,这取决于操作系统是否允许Nginx继续调用accept。
更准确的做法是查看当前生效配置和实时状态。使用nginx -T可以输出所有配置,包括未被注释的events块内容。使用stub_status模块可以观察当前活跃连接数:
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
压测时执行curl http://127.0.0.1/nginx_status,如果Active connections长时间接近或等于worker_connections的值,就基本可以确认是连接数瓶颈。另一个辅助手段是通过ss -s或netstat -an | grep :80 | wc -l查看当前TCP连接数量,判断是否已经触顶。注意不要只看QPS曲线,因为连接失败时QPS可能反而下降,容易误导排查方向。
定位时还可以结合内核丢弃计数。执行netstat -s | grep -i listen查看listen queue溢出情况。如果SYN到listen socket的队列溢出计数持续增加,说明新连接在进入Nginx之前就已经被内核丢弃,这通常与worker_connections不足或accept速度不够有关。
调整worker_connections与系统级限制
解决连接不足不能只改一个数字。首先要根据业务类型估算需要的总连接数。静态资源服务可以按客户端连接数计算;反向代理服务需要乘以2左右的系数。确认目标值后,修改events块:
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 20480;
}
worker_rlimit_nofile用来提高Nginx可打开的文件描述符上限。如果只增加worker_connections却不调整这个值,Nginx可能以较低的文件描述符上限运行,仍然无法建立足够连接。此外,操作系统层面还需要调整ulimit。可以修改/etc/security/limits.conf,为运行Nginx的用户设置nofile为65535,然后重新登录或重启服务使其生效。执行ulimit -n查看当前值。
内核网络参数同样不能忽略。提高net.core.somaxconn能让accept队列容纳更多尚未被accept的连接,避免在高并发瞬间内核直接拒绝连接。常见的调整如下:
sysctl -w net.core.somaxconn=65535 sysctl -w net.core.netdev_max_backlog=65535
这些参数不会直接增加worker_connections,但能让连接在进入Nginx之前有更大的缓冲空间。压测时如果只调整了worker_connections而内核参数不变,连接失败现象可能不会完全消失。
如何验证调整结果并避免过度配置
调整完成后需要重新加载Nginx配置,使用nginx -t检查语法,再执行nginx -s reload使配置生效。压测工具可以使用wrk、ab或locust。wrk适合快速制造并发连接:
wrk -t 16 -c 5000 -d 60s http://127.0.0.1/
压测过程中持续观察stub_status的Active connections和accepts统计。如果Active connections能够平稳上升且不再出现大量失败,说明调整方向正确。同时还要关注Nginx进程的内存占用,使用ps aux | grep nginx查看RSS。每个连接大约占用数KB到数十KB内存,2万连接可能带来数百MB到数GB的内存消耗,必须结合机器实际内存评估。
过度配置会带来新的问题。worker_connections设置过大本身不会直接占用大量内存,但每个实际建立的连接都会消耗内存和文件描述符。如果配置值远超业务峰值,不仅浪费资源,还会让故障发生时系统更快触及内存或文件描述符上限。更合理的做法是根据压测数据和业务增长预留20%到30%的余量,而不是一次调到几十万。最后,调整后要持续监控连接数、QPS、错误日志和系统内存,确保Nginx在高并发下不会因为worker_connections不足再次出现连接失败。
Nginx worker_connections连接失败最大连接数修改时间:2026-08-26 15:29:18