Nginx 调优别急着改配置:一台 2 核机器扛住 8000 并发,钱花在哪一步

2026-10-02 17:04 1004 次浏览

很多人第一次遇到 Nginx 撑不住,是在监控上看到 502 突然涨起来,登录机器一看 CPU 才百分之十几,内存也还剩一大半。这时候最容易犯的错是去改 worker_processes,把它从 auto 改成具体核数,甚至翻倍写。改完重启,并发上来照样报错。问题的根子往往不在计算资源,而在连接数上限和内核参数,这两处不放开,加多少核都是白搭。

下面按排查顺序说,先说怎么定位,再说每项参数改多少、花多少钱能换回什么。

先别看配置,用 ss 和 dmesg 把瓶颈钉死

我的习惯是登录后先跑两条命令。第一条看监听队列有没有溢出,第二条看内核有没有丢连接。

  • ss -lnt:关注 Send-Q 那一列,如果持续不是 0,说明 accept 队列在堆积,连接进来了但进程没及时接走。
  • dmesg | grep -i 'nf_conntrack\|SYN':出现 table full 或者 drop,说明连接跟踪表或者半连接队列被打满。

这两处报错,指向的是同一类问题:系统允许的连接数不够用。很多 2 核 4G 的入门机器默认文件描述符只有 1024,Nginx 的 worker_connections 默认也是 1024,两个 1024 相乘看着很大,实际上还要除以 worker 数,再扣掉反向代理到后端的连接,真正能对外接的并发可能只有几百。并发一过这个线,新连接直接进不来。

所以别急着加钱升配。先用上面两条命令确认是连接数卡住,还是带宽或者磁盘卡住,判断错了后面全是浪费。

worker_connections 和 ulimit 必须一起动

确认是连接数问题后,改两处地方,缺一个都不生效。

第一处是系统层。编辑 /etc/security/limits.conf,给运行 Nginx 的用户加上 nofile 65535,同时确认 systemd 启动的服务有 LimitNOFILE 覆盖,否则 limits.conf 对 systemd 托管的进程不生效。这一步不花钱,但漏了它,Nginx 里写多大都没用。

第二处是 Nginx 配置里的 worker_connections。4 核机器上我会写到 10240 到 20000 之间,再往上要配合 worker_rlimit_nofile 一起调。这里有个经验值:worker_connections 乘 worker 数,不要超过系统总文件描述符上限的七成,留三成给后端连接和日志文件。

这两处改完,一台 2 核 4G 的机器通常能把并发从几百推到 8000 上下,具体数字取决于请求是静态还是动态、有没有走反向代理。如果请求里带大量后端 API 调用,实际对外并发会低不少,因为每个用户请求要占两条连接。

钱花在这里是零成本,但人力成本不低,需要重启服务,最好在低峰期做。

静态资源多的站,open_file_cache 比调 worker 更值

如果是图片站、下载站这类静态文件占大头的业务,光调连接数提升有限,磁盘 IO 很快就会成为新瓶颈。这时候开 open_file_cache,让 Nginx 把文件句柄和元信息缓存在内存里,命中时不用每次去问文件系统。

配置大致是 open_file_cache max=10000 inactive=30s,再加一行 open_file_cache_valid 60s 和 open_file_cache_min_uses 2。max 这个数按你实际的热文件数量估,10000 对应的大致是几十 MB 内存,对 4G 以上的机器完全吃得下。开启后静态文件的响应时间通常能从毫秒级降到微秒级,效果比再调 worker 数明显。

代价是文件更新后有最长 60 秒的延迟才生效,发布流程里要注意,别把缓存时间设太长。

带宽这块要单独说。连接数放开之后,如果出口只有 20M,8000 并发里只要有一部分在传大文件,带宽立刻打满,表现是连接建立正常但传输极慢。我一般会算一笔账:20M 带宽约等于每秒 2.5MB,一张 200KB 的图,理论上一秒只能服务十几个并发下载。要做大带宽业务,机器本身的连接数调优只是及格线,出口得换。像 美国洛杉矶大带宽服务器 XIX 这种 G 口机型,E5-2683v4 双路配 64G,月付 628.50 美元,适合图片和下载类站点,把带宽这一环补齐。

压测验证,别凭感觉收工

改完配置一定要压一轮再上线。用 ab 或者 wrk,从 500 并发开始,每档跑 60 秒,同时开着 ss 看 Send-Q 和 top 看软中断占比。

  • 并发涨上去但 QPS 不涨,Send-Q 也不积压,多半是后端接口慢,跟 Nginx 无关。
  • si 这一列(软中断)超过单核的 30%,说明网络包处理成了瓶颈,要考虑多队列网卡或者换更强的机型。
  • 错误率在某一档突然跳起来,那就是这一档越过了某个上限,对照上面改过的参数找。

我一般会把压测结果和改之前的数字放在一起对比,确认每项参数改动确实带来了提升,没提升的就回滚,配置越少越好维护。

收个尾。预算紧、流量不大的站,先把 ulimit 和 worker_connections 调对,零成本能解决大部分 502。静态资源重、出口经常跑满的站,调优之后该换大带宽机器就得换,20M 的口子服务不了高并发下载。压测数据比任何经验值都可靠,上线前跑一轮,比事后救火便宜得多。