调参之前先看清楚瓶颈
Nginx 本身不是性能问题的第一嫌疑对象,绝大多数站点的瓶颈在于后端 PHP-FPM、数据库或未压缩的图片。调参前先确认当前的瓶颈:看 CPU 是否打满、连接数是否到上限、后端是否排队。盲目改参数容易把问题掩盖,反而更难定位。以下参数适合在确认 Nginx 自身是瓶颈后再动。
worker_processes 与 worker_connections
worker_processes 设为 auto,让 Nginx 自动按 CPU 核数起进程,这是目前最稳妥的取值。worker_connections 表示单个 worker 允许的连接数,默认 1024 对静态站通常够用,但站内引用多、开启 keepalive 或有较多反向代理连接时,可提到 4096 甚至更高。真正允许的最大并发约为 worker_processes × worker_connections,其中作为反向代理时要按 worker_rlimit_nofile 同步放宽文件描述符限制,否则改了也不生效。
keepalive 与超时
keepalive_timeout 控制长连接保持时长,默认 75 秒对浏览器友好;upstream 块里的 keepalive 则让 Nginx 到后端保持长连接,能显著减少 TCP 与 TLS 握手开销,值得开启。与之配套的 client_body_timeout、client_header_timeout、send_timeout 建议保持在 10-60 秒区间,过短会让慢网络用户请求失败,过长则让恶意连接占住资源。
缓冲区与请求体限制
client_max_body_size 决定允许上传的最大文件,默认 1M 对带图上传远远不够,独立站常见取值是 20M-64M,按业务上限设置即可,不必盲目放大。缓冲区参数(proxy_buffer_size、proxy_buffers)在反向代理响应头较大或后端返回慢时可微调,但如果频繁需要改,通常说明后端有问题。
静态文件缓存与压缩
为图片、CSS、JS 配置 expires 与 access_log off,让浏览器缓存长期生效,能大幅降低重复请求。开启 gzip(或模块支持的 brotli)压缩文本资源,压缩等级 4-6 之间性价比最高,再高只增加 CPU 消耗、几乎不减少体积。注意 gzip 不要压缩已压缩格式(jpg/png/mp4),白白浪费 CPU。
修改与验证流程
- 修改前备份配置文件,用 nginx -t 校验语法
- 用 systemctl reload nginx 平滑重载,不要 restart 断开长连接
- 修改 worker_connections 或 rlimit 时,确认 ulimit -n 与系统 fs.file-max 同步放开
- 压测前记录基线,压测后对比响应时间与错误率
- 观测一段时间无异常后再固化配置
常见误区
- 把 worker_connections 调到数万但没改文件描述符限制,实际不生效
- keepalive 太长导致空闲连接堆积,占满 worker 连接槽
- 关掉 access_log 以求性能,结果出问题无日志可查
- 只压测首页就下结论,忽略了产品页与接口的真实开销
调参的目标是稳定,不是数字好看。每次只改一到两项,改完压测对比,才能确定到底哪一项起了作用。