一条命令让Nginx性能翻10倍,90%的人都配错了
你的Nginx配置可能一直在"裸奔"
上周帮一个朋友排查他的网站性能问题。一个日活不到 1 万的 WordPress 站点,TTFB 居然要 400ms。
看了一眼他的 Nginx 配置——没有 Brotli 压缩,没有 HTTP/3,没有 FastCGI 缓存,没有速率限制,连安全头部都没配。
这配置就像是买了一辆跑车,然后用一档在开。
很多人觉得 Nginx 配置嘛,能跑就行。但事实是,默认配置和优化配置之间的差距,可以是 10 倍。
Dev.to 上有篇文章(热度 13490),介绍了一个叫 nginx-optimizer 的开源工具。一条命令,自动分析你的 Nginx 配置,找到性能瓶颈并修复。
今天不推销工具,聊聊它背后的那些优化点——这些是你手动也应该知道的事。
这是提升最大的一项。
没有 FastCGI 缓存时,每次用户请求都要:Nginx → PHP-FPM → PHP 解析 → 数据库查询 → 返回。整个链路走一遍,400ms 轻轻松松。
开了 FastCGI 缓存后:匿名用户的请求直接从缓存返回 HTML,绕过 PHP 和数据库。TTFB 直接降到 15ms 以下。
核心配置:
fastcgi_cache_path /var/cache/nginx levels=1:2
keys_zone=WORDPRESS:64m inactive=60m
max_size=512m;
server {
fastcgi_cache WORDPRESS;
fastcgi_cache_valid 200 301 302 60m;
fastcgi_cache_use_stale error timeout updating invalid_header http_500 http_503;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
add_header X-FastCGI-Cache $upstream_cache_status;
}
效果:服务器 CPU 使用率从 80% 降到 8%,承载能力提升 10 倍。
很多人只开了 Gzip,但 Brotli 的压缩率比 Gzip 高 15-25%。
一个 45KB 的 HTML 文件:
差距不大?乘以你每天几百万个请求,带宽省出来的钱够请个实习生。
# Brotli(需要安装模块)
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/json
application/javascript text/xml application/xml
image/svg+xml;
# Gzip 作为回退
gzip on;
gzip_comp_level 6;
gzip_types text/plain text/css application/json
application/javascript text/xml application/xml;
HTTP/1.1 每个请求一个 TCP 连接,HTTP/2 多路复用但仍有队头阻塞。HTTP/3 基于 QUIC(UDP),彻底解决了队头阻塞问题。
对于移动端用户(高延迟、不稳定网络),HTTP/3 的页面加载速度提升 15-25%。
listen 443 quic reuseport;
listen 443 ssl;
http2 on;
add_header Alt-Svc 'h3=":443"; ma=86400';
很多配置的 expires 30d,但没加 immutable。浏览器每次都要去验证资源有没有变——白跑一趟。
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2)$ {
expires 365d;
add_header Cache-Control "public, immutable";
access_log off;
}
immutable 告诉浏览器:"这个 URL 对应的资源永远不会变,别来验证了。"配合文件名哈希(如 app.a1b2c3.js),完美解决缓存问题。
WordPress 的 wp-login.php 和 xmlrpc.php 是暴力破解的重灾区。
# 限制登录尝试
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;
location = /wp-login.php {
limit_req zone=login burst=3 nodelay;
}
# 屏蔽 xmlrpc.php(大量暴力请求的来源)
location = /xmlrpc.php {
deny all;
}
效果:阻止 99% 的暴力破解请求,且不影响正常用户。
对于未缓存的请求(管理员操作、AJAX 请求),OpCache 直接提升 PHP 执行速度 20-40%。
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
opcache.jit=1255
如果你不想手动一个个改,可以用 nginx-optimizer:
# 安装
curl -fsSL https://raw.githubusercontent.com/MarcinDudekDev/nginx-optimizer/main/install.sh | bash
# 第一步:分析(不改任何东西,只看报告)
nginx-optimizer analyze
# 第二步:预览(看看会改什么)
nginx-optimizer optimize --dry-run
# 第三步:执行
nginx-optimizer optimize
# 第四步:验证
nginx-optimizer verify
# 不满意?回滚
nginx-optimizer rollback
工具会自动备份配置、验证语法(nginx -t)、失败自动回滚。支持选择性优化,比如只要 HTTP/3 不要安全加固:
nginx-optimizer optimize --feature http3 --exclude security
优化前后对比:
虽然这篇文章是从 WordPress 场景出发的,但这些优化适用于任何 Nginx 反向代理场景:
核心思路不变:减少重复计算、压缩传输体积、利用缓存、限制异常流量。
Q: nginx-optimizer 支持哪些环境?
A: 物理机、Docker、常见 Linux 发行版都支持。macOS 可以通过 Homebrew 安装。注意工具会直接改 Nginx 配置文件,生产环境务必先在测试环境验证。
Q: FastCGI 缓存会不会导致数据不一致?
A: 会。用户提交评论后,可能还会看到旧的缓存页面。解决方案:
Q: HTTP/3 需要什么前置条件?
A: 需要 Nginx 编译时带 --with-http_v3_module,且服务器 UDP 443 端口开放。如果用 Docker,需要确保 UDP 端口也映射了(-p 443:443/udp)。
Q: Brotli 和 Gzip 可以同时开吗?
A: 可以,而且建议同时开。支持 Brotli 的浏览器(Chrome、Firefox、Edge)会用 Brotli,不支持的(Safari)会回退到 Gzip。
Q: 我的 Nginx 配置已经很复杂了,工具会不会搞坏?
A: nginx-optimizer 会先备份配置,修改后用 nginx -t 验证语法。如果验证失败,自动回滚。但你最好还是先 --dry-run 看看改动,确认没问题再执行。
Nginx 是整个互联网最核心的反向代理之一,全球超过 34% 的网站用它。但大多数人用的只是它的默认配置,就像买了 RTX 4090 用来浏览网页。
六个优化点,每个都能单独带来显著提升。如果你是运维,这些是基本功;如果你是开发者,这些是部署知识。
下次部署完一个服务,花 10 分钟检查一下 Nginx 配置。你的用户(和你的钱包)会感谢你的。
阅读原文:https://mp.weixin.qq.com/s/Lh1wxehgVQQ3ox79yVaurA