Nginx 调优实战:从 worker 到内核,把并发能力榨干
很多站长把 Nginx 装完就用,结果高并发下 RPS 上不去、延迟飙升。本文从 worker 进程、连接数、文件描述符、内核参数到缓存压缩,逐项给出可落地的调优清单,并说明每项改动的实际收益与风险。
Nginx 默认配置是为「能跑起来」设计的,不是为「扛住高并发」设计的。很多站点上线后 QPS 卡在几百就上不去,CPU 却不高,问题往往出在几个默认值没改。
worker 进程与连接数:先让 Nginx 用满 CPU
默认 worker_processes 1 只用一个核,多核机器等于浪费。改成 auto 让 Nginx 按 CPU 核心数自动 fork。接着看 worker_connections,默认 512,意味着单 worker 最多同时处理 512 个连接。按公式「最大连接数 = worker_processes × worker_connections」估算,4 核机器配 10240 就能覆盖大多数场景。
别忘了 worker_rlimit_nofile。系统默认单进程文件描述符上限常见是 1024,Nginx 一忙就报「too many open files」。把它设到 65535,并在 systemd 的 LimitNOFILE 里同步放开,否则重启后又被压回去。
内核参数:不改这些,Nginx 再好也白搭
Nginx 调优有一半工作在操作系统层。以下参数建议写进 sysctl.conf:
- net.core.somaxconn:全连接队列长度,默认 128 太小,调到 65535,避免高并发时握手被丢。
- net.ipv4.tcp_max_syn_backlog:半连接队列,同样调到 65535。
- net.ipv4.tcp_tw_reuse:允许复用 TIME_WAIT 连接,短连接场景收益明显。
- net.ipv4.ip_local_port_range:本地端口范围扩到 1024-65000,反向代理场景尤其关键。
- fs.file-max:系统级文件句柄上限,按内存规模调大。
改完用 sysctl -p 生效,再用 ulimit -n 确认进程级限制真的放开了。
缓存、压缩与日志:省下的都是真金白银
静态资源交给 Nginx 直接吐,别每次都回源。用 open_file_cache 缓存文件句柄和元数据,命中率高时能省掉大量 stat 系统调用。开启 gzip 压缩文本类响应,但别压图片和视频,纯属浪费 CPU。
日志是另一个隐形杀手。高流量下每个请求都写 access_log,磁盘 IO 会拖垮性能。建议用 buffer 批量写,或对静态资源关掉日志。如果业务对延迟敏感,考虑把 Nginx 部署在带宽充裕的物理机上,比如香港自营物理服务器(50M)⑤,50M 独享带宽配合内核调优,抗突发流量的底气会足很多。
最后提醒:所有参数都要压测验证。用 ab 或 wrk 跑一轮,对比调优前后的 RPS 和 P99 延迟,别凭感觉调。