Nginx调优别乱抄参数,先把这几个瓶颈找准

2026-09-24 08:42 1002 次浏览

机器上跑着Nginx,平时访问量不大没什么感觉,一到活动或者被爬虫盯上,响应时间从几十毫秒跳到几百毫秒,CPU也上去了。这时候多数人会去搜一堆参数模板往配置文件里塞,改完重启,发现好像快了一点,但说不清到底哪一项起了作用。我见过不少这样的配置,worker_connections 改成 65535,keepalive_timeout 拉到 300,结果并发一上来反而更慢。

问题出在没找准瓶颈。Nginx 的调优不是一个参数表能解决的,它跟你的业务形态强相关:是静态文件为主,还是反向代理后端;是长连接多,还是短请求多。方向搞错了,参数怎么调都是白费。

worker 进程数与 CPU 核数的关系

worker_processes 设成 auto 让 Nginx 自己判断,通常就够用。它的逻辑是按 CPU 核心数来分配,4 核机器起 4 个进程,每核一个,避免进程间争抢。

但有一个例外:如果这台机器同时还跑着 MySQL 或者别的服务,那就不能全给 Nginx。我一般会留一到两个核给系统和其他进程,比如 8 核的机器,worker_processes 设 6 比设 8 更稳。多出来的两个 worker 在负载高的时候会互相抢 CPU 时间片,反而增加上下文切换开销。

worker_cpu_affinity 这个参数很多人不设,其实在核数多的时候有用。它把每个 worker 绑到固定核心上,减少缓存失效。4 核机器绑 0001 0010 0100 1000,8 核就往后加。核数少的时候效果不明显,16 核以上能感觉到差别。

连接数上限不等于并发能力

worker_connections 设成 10240 还是 65535,对实际并发的影响没有想象中大。这个值指的是单个 worker 能同时处理的最大连接数,但真正限制并发的往往是文件描述符上限和内存。

Linux 默认的 ulimit -n 是 1024,Nginx 配置里写再大也没用,得先在系统层面放开。改 /etc/security/limits.conf,nofile 设成 65535 或者更高,然后确认 worker_rlimit_nofile 跟这个值对齐。

另一个常被忽略的是 keepalive_timeout。设太长,空闲连接占着 worker 名额不放,新请求排不进来;设太短,短连接场景下频繁握手,CPU 花在 TCP 三次握手上的时间就上去了。静态资源为主的站点,15 到 30 秒比较合适;反向代理后端的话,后端响应本身快,keepalive 可以设短些。我一般会先从 15 秒起步,看监控里 TIME_WAIT 的数量再决定要不要调。

sendfile、gzip 与静态资源处理

sendfile on 几乎是必开的,它让内核直接把文件从磁盘送到网卡,省掉用户态和内核态之间的数据拷贝。但有个坑:开了 sendfile 之后,如果同时开 gzip,静态文件会被压缩后再走 sendfile,反而多一道 CPU 开销。所以大文件下载走 sendfile,小文件压缩走 gzip,两个场景分开配置。

gzip 压缩不是越多越好。gzip_comp_level 设成 9 看着很极致,实际压缩比从 6 到 9 只提升几个百分点,CPU 占用却翻倍。我一般用 5 或者 6,压缩比和 CPU 消耗比较平衡。

  • gzip_types 只列文本类:text/html、text/css、application/javascript、application/json
  • 图片和视频不要开 gzip,本身已经是压缩格式,再压没意义还费 CPU
  • gzip_min_length 设 1000 以上,太小的文件压缩后可能更大

静态资源如果走 CDN,Nginx 这一层就不用管压缩了,交给 CDN 的边缘节点处理更划算。

缓存与超时:省下的不只是响应时间

proxy_cache 用好了能省掉大量回源请求。后端接口返回的数据如果几分钟内不变,缓存 30 秒到 2 分钟,后端压力能降一半以上。代价是数据有延迟,下单、支付这类接口绝对不能缓存。

超时参数设太短,后端稍微慢一点就 504;设太长,慢请求堆积把 worker 占满。proxy_read_timeout 默认 60 秒,多数业务够用,接口响应超过 60 秒本身就有问题。proxy_connect_timeout 可以短一些,5 到 10 秒,连不上后端就快速失败,不要拖着。

这些调优做完,如果机器还是吃力,那就不是 Nginx 配置的问题了。反向代理场景下后端本身慢,Nginx 再优化也没用。静态资源多、并发高的站点,可以考虑上一台带宽更足的独立服务器,把文件服务单独拆出去。像 美国硅谷超大带宽不限流量高配置服务器 XXXII 这种 128G 内存配 20G 带宽的机器,跑静态资源分发和大流量转发比较合适,月付 $9328.50,适合流量已经上量的业务。

最后给一个判断标准:改完配置不要只看“感觉快了”,用 ab 或者 wrk 压一遍,看 QPS 和 P99 延迟的变化。每改一项测一次,确认有效再保留。没测过的参数,不要往生产环境放。