Nginx 调优实战:从连接数到缓存,哪些参数改了真有效
很多人第一次觉得 Nginx 不对劲,是在压测的时候。本机 curl 一切正常,用 ab 或 wrk 打上去,QPS 刚过 800 就开始出现 502,top 里 nginx 的 CPU 占满一个核,剩下的核闲着。这种场景我见过不少,问题基本不在 Nginx 本身,而在默认配置压根就是给低并发准备的。
调优这件事,先得分清楚瓶颈在哪一层。是连接数打满了,还是 upstream 响应慢拖住了 worker,抑或是磁盘 IO 让静态文件读不过来。方向搞错,改再多参数也是白搭。
worker 进程和连接数:先别急着往大改
默认 worker_processes 是 1,现代多核机器上这等于自废武功。改成 auto 让它跟 CPU 核数走,这一步几乎没争议。真正容易踩坑的是 worker_connections。
这个值决定单个 worker 能同时处理多少连接,但它不是「越大越好」。每个连接都要占内存,读缓冲区、写缓冲区、keepalive 保持的连接都算在内。4 核 8G 的机器上,worker_connections 设成 10240 通常够用,再往上加,内存会先扛不住。
还有个乘法关系常被忽略:worker_processes × worker_connections 才是理论上限。4 个 worker 各 10240,理论 40960 个并发连接,对绝大多数业务来说早就溢出了。真正卡住你的往往是后面几项。
keepalive_timeout 默认 65 秒,对短连接为主的站点偏长。压测时大量连接卡在 keepalive 状态占着名额,新请求反而排不进去。设成 15 到 30 秒,长连接该保持的照样保持,闲置的能及时释放。这点代价很小,收益却直接体现在并发数上。
缓存与压缩:省的是带宽,换的是 CPU
静态资源这一块,改动带来的体感最明显。gzip 打开之后,一个 200KB 的 JS 文件传到客户端可能只剩 60KB,首屏时间能差出一大截。但 gzip 是拿 CPU 换带宽,压得太狠反而拖慢响应。
我的做法是 gzip_comp_level 停在 5,不再往上调。级别从 5 到 9,压缩率提升有限,CPU 开销却接近翻倍。gzip_types 只列真正需要的类型,json、css、js、xml 这些,图片和视频本来就压过了,再压一遍纯属浪费。
proxy_cache 是另一块值得花时间的地方。上游接口如果返回内容变化不频繁,缓存 5 到 10 分钟能砍掉大量回源请求。但缓存目录别放在系统盘,磁盘 IO 打满会连累整个 Nginx。挂一块独立盘,或者干脆用内存盘,命中率高的场景下效果立竿见影。
- proxy_cache_valid 按状态码分别设置,200 缓存久一点,404 短一点,避免脏数据长期驻留
- proxy_cache_key 默认带 $args,带参数的接口要确认是否真需要区分,否则命中率会被参数打散
这里有个常见的误区:把缓存时间设得很长以为能省资源,结果上游数据更新了页面还是旧的,运维半夜被叫起来清缓存。缓存策略得跟业务的数据更新频率对齐,没有通用答案。
压到瓶颈之后,硬件该怎么补
参数调到位了,如果并发还是上不去,那说明单机确实到头了。这时候要么横向加机器做负载均衡,要么换更强的物理机。云主机在突发流量下容易被邻居影响,物理机的资源是独占的,延迟波动小得多。
香港机房的物理机对国内访问有天然优势,延迟通常比美西低几十毫秒。像香港裸机云 XIV 这种 Gold-6133*2 配 64G 内存的配置,跑 Nginx 做前端代理绰绰有余,20M 带宽对中小站点也够用。如果业务面向北美用户,美国洛杉矶大带宽服务器 VIII 的 G 口带宽在扛突发流量时更从容。
选物理机还是云主机,我的判断标准是看流量曲线。平稳增长的业务,云主机弹性好、成本低;有明显峰谷、或者对延迟敏感的业务,物理机更稳。这笔钱花得值不值,取决于你能不能容忍一次卡顿带来的用户流失。
改完记得验证,别凭感觉
所有参数改完,一定要用 wrk 或 ab 重新压一遍,对比改之前的 QPS 和错误率。我一般会同时看 nginx 的 stub_status,连接数、活跃连接、等待连接这几个指标能直接反映配置是否合理。
如果 active connections 长期贴着 worker_connections 上限,说明连接数不够;如果 waiting 数量居高不下,多半是 keepalive 时间设太长。监控数据比直觉靠谱。
最后给个可直接执行的结论:4 核 8G 的机器,worker_processes auto、worker_connections 10240、keepalive_timeout 30、gzip_comp_level 5,这套组合能覆盖多数中小站点。真要上到万级并发,单机调优的天花板已经不远,该考虑加机器或者换物理机了。