Nginx 性能调优别只盯参数,先把服务器这层理清楚
见过太多人把 Nginx 配置文件改得密密麻麻,结果 QPS 还是上不去。一问机器配置,4 核 8G 的云主机跑着三个 WordPress 站,磁盘 IO 已经跑到 100% 了,这时候改 worker_processes 到 8 有什么用?Nginx 再强也架不住底层服务器拖后腿。我一般会先看机器本身的瓶颈在哪,再动配置。
先搞清楚你的瓶颈在 CPU 还是 IO
Nginx 是事件驱动模型,单个 worker 就能扛几千并发连接。但前提是 CPU 得跟得上,磁盘不能拖后腿。静态文件走 sendfile 是零拷贝,基本不吃 CPU;但如果是反代到后端的动态请求,每个连接都要占用 worker 的处理时间。
拿 4 核的机器来说,worker_processes 设成 4 是常规操作,但如果你跑的是 HTTPS 流量,加解密会吃满 CPU。这时候要么上多核,要么加 SSL 硬件卡。我见过不少配置把 worker_connections 设到 65535,但系统本身的 file-max 才 1024,跑高并发直接报错。
- ulimit -n 先确认,默认 1024 的话 Nginx 连接数上限就被卡死了
- 磁盘 IO 用 iostat 看 %util,长期超过 80% 说明该换 SSD 或加内存做缓存
- 带宽跑满的表现是延迟均匀上升,不是丢包,这个和被打的区别很明显
换我我会先花半天把这三项跑一遍,再决定是调参数还是换机器。调参不要钱,换机器要钱,顺序不能反。
几个真正影响吞吐的配置项
keepalive_timeout 默认 75 秒,对高并发场景太长了。长连接占着 worker 不放,新请求排队的概率就大。我一般会降到 15 到 30 秒之间,具体看业务——如果用户是持续交互的,15 秒够了;如果是 API 调用,5 秒都行。
gzip 这块有个坑。开 gzip 省带宽,但压缩本身吃 CPU。静态资源建议压好放那,别让 Nginx 实时压。动态内容如果 CPU 本来就紧张,gzip 级别降到 1 或 2 就行,别用默认的 6。
client_body_buffer_size 默认 8k 或 16k,上传接口多的话这个值要往上调。不然大文件上传会先写磁盘临时文件,再读回来,一来一回磁盘 IO 翻倍。调到 128k 能覆盖多数表单提交,再大就得靠 client_max_body_size 限制了。
还有 proxy_buffer_size 和 proxy_buffers,反代场景下这两个值设小了,后端返回的 header 一大就报 502。我一般把 proxy_buffer_size 设成 16k,proxy_buffers 设 8 32k,基本够用。
什么时候该考虑换物理服务器
云主机共享 CPU 和磁盘 IO,邻居一跑满你就跟着卡。Nginx 调优做到极致,也就把软件层的损耗压到最低,硬件层的争抢是躲不掉的。
如果你的站已经稳定跑在几千 PV 以上,而且 iostat 的 await 长期在 20ms 以上,那基本可以判断是磁盘争抢。这时候加 CPU 内存没用,得换独享资源的机器。物理服务器或者独立服务器在磁盘 IO 和带宽上是独享的,延迟曲线平滑很多。
秀米云这边有几款机器适合这种场景。做外贸站或者面向东南亚用户的,可以看新加坡大带宽服务器 VIII,E5-2698v4 双路配 64G 内存,50M 带宽,月付 $628.50,跑 Nginx 反代加静态缓存很稳。如果是美国线路为主,美国洛杉矶物理服务器3 那款 E5-2620 配 32G 内存和 100M 带宽,月付 $109.00,做中小型站群的入口层够用了。对防御有要求的可以看美国西雅图高防服务器50,双路 Platinum-8168 加 64G 内存,100M 带宽带高防,月付 $489.00。
这里有个取舍:云主机弹性好,按月付随时能退;物理服务器性能稳,但换配置要重新上架。我一般建议先用云主机跑一个月,把真实负载数据拿到手,再决定要不要换物理机。数据比感觉准。
压测和监控比调参更重要
改完配置不压测等于白改。ab 或者 wrk 跑一轮,看 QPS 和延迟分布。重点看 P99 延迟,平均值好看没用,长尾请求才是用户能感知到的卡顿。
监控这块,Nginx 的 stub_status 模块打开,用 Prometheus 加 Grafana 拉个面板。活跃连接数、等待连接数、请求速率这三个指标放一起看,能快速定位是连接堆积还是后端响应慢。
最后给个直接的结论:如果你现在跑的是 2 核 4G 以下的机器,先把 worker_connections 和文件句柄数调对,成本为零。如果调完 P99 还是超过 500ms,而且磁盘 await 偏高,那就别折腾了,换独享资源的机器。预算在每月百来美元这个档位,换物理服务器带来的提升比继续抠参数大得多。高防需求明确的话直接上带防御的机型,省得被打的时候临时找方案。