Nginx 调优别乱改:worker、连接数与缓存的三笔账

2026-09-25 14:15 1002 次浏览

很多人第一次碰 Nginx 调优,是在网站开始变慢之后。CPU 没满,内存还剩一半,可用户就是反馈页面转圈、偶尔 502。登上去一看,nginx.conf 还是装完就没人动过的默认配置,worker_connections 停在 1024,文件描述符也没调。问题不在硬件,在于默认值压根不是给高并发场景准备的。

调优这件事最怕的是背参数表。别人说 worker_processes 设成 auto,你就设 auto;别人说开 TCP 快速回收,你也开。改完没出问题,不代表改对了,只代表流量还没上来。真正值得花时间的,是把每个参数背后的资源账算清楚。

worker 进程数与连接数:先搞清楚谁在限制谁

Nginx 处理请求靠的是 worker 进程。默认配置里 worker_processes 通常是 1,意味着不管你有几颗 CPU 核,实际只有一个进程在干活。设成 auto 之后 Nginx 会按 CPU 核数拉起对应数量的进程,这是多数情况下的合理起点。

但进程数只是第一层。每个 worker 能同时处理的连接数由 worker_connections 决定,默认 1024。一台 8 核机器,8 个 worker 乘以 1024,理论上限是 8192 个连接。这个数字看着不小,实际会被两件事吃掉。

  • 反向代理场景下,Nginx 既要接客户端连接,又要向后端发起连接,一个请求占用两个连接位。
  • keepalive 长连接会一直占着位置,直到超时或被关闭。

所以反代站的实际并发能力,大约只有标称值的一半。我把 worker_connections 提到 10240 之后,同一台 8 核 16G 机器从 800 并发丢包变成能稳定撑到 5000 上下。代价是每个连接都占内存,连接数拉太高、keepalive 又设得很长,内存会先撑不住。

配套要改的是文件描述符。系统默认单进程 1024,Nginx 连接数调到 10240 却忘了改 ulimit,照样会在 1024 附近报 too many open files。worker_rlimit_nofile 和系统 limits.conf 两边都得放开,这个坑我见过不止一次。

keepalive 超时:省下的不是时间,是内存

keepalive_timeout 默认 65 秒。这个值的含义是连接空闲多久之后关闭。设得长,用户连续点击时不用重新握手,体验好;设得短,连接回收快,内存占用低。

静态资源站和 API 站的取舍完全不同。图片、CSS 这类资源,一个页面几十个请求,长连接能省掉大量握手开销,65 秒甚至更长都合理。但如果是短连接为主的 API,客户端发完请求就走,连接挂着纯粹是浪费。我一般会把这类站点的 keepalive_timeout 压到 15 到 20 秒。

还有一个容易被忽略的参数是 keepalive_requests,单个连接最多处理多少个请求。默认 100,对静态站偏低,调到 1000 能减少连接重建次数。但要注意,调高之后单个连接存活时间变长,内存回收变慢,低配机器上反而容易出问题。

如果你的站点是放在海外机房、面向国内用户,连接建立本身的延迟就比本地高不少,长连接带来的收益会更明显。日本东京这类机房到国内的延迟通常在几十毫秒量级,握手成本摆在那里,keepalive 该留就留。

缓存与压缩:真正省下带宽的那一步

前面几个参数解决的是「能不能扛住」,缓存解决的是「扛得省不省」。proxy_cache 把后端返回的内容存到本地磁盘或内存,后续相同请求直接由 Nginx 返回,后端压力能降一大截。

配置缓存要盯住三样东西:缓存路径和大小、缓存有效期、以及哪些响应不该缓存。带 Set-Cookie 的响应、POST 请求、后台管理页面,这些默认就不该进缓存,写错规则会把登录态串给别的用户。

gzip 压缩是另一笔账。文本类响应压完通常能省六到七成带宽,但压缩本身吃 CPU。静态文件提前压好存成 .gz 让 Nginx 直接发,比每次请求现压划算得多。图片和视频别开 gzip,压不动还白费 CPU。

说到硬件,如果站点是静态内容为主、又面向海外用户,一台带宽给得足的独立服务器比堆参数更实在。秀米云的东京独立服务器配的是 E5-2698V3 加 64G 内存,20M 带宽,月付 214 美元,跑反向代理加缓存层比较从容。

改完别急着上线

所有参数改完,先用 nginx -t 验证语法,再 reload 而不是 restart,避免连接中断。上线后盯三件事:error.log 里有没有 too many open files、worker 连接数有没有打满、以及内存曲线是不是持续爬升。

最后给个能直接照做的结论。个人博客、访问量不大的企业站,把 worker_processes 设 auto、worker_connections 提到 4096、文件描述符放开,基本就够了,别折腾更多。日均几十万 PV 的反代站,重点放在连接数、keepalive 和 proxy_cache 三处,缓存命中率能到八成以上,后端压力立竿见影。真正的高并发场景,参数调到极限也不如加机器或者上负载均衡,这一点别指望配置文件能解决。