关键不是看“能不能压”,而是观察低端服务器(cpu≤2核、内存≤2gb、无ssd)下brotli是否稳定压缩、不拖慢响应、不超时抖动;需验证三项:压缩是否触发、压缩比是否≥2.0、ttfb是否可控。

在低端服务器上测试 Nginx 的 Brotli 性能,关键不是看“能不能压”,而是观察它在资源受限(CPU ≤ 2 核、内存 ≤ 2GB、无 SSD)时是否仍能稳定压缩、不拖慢响应、不引发超时或服务抖动。重点验证三项:压缩是否真正触发、压缩比是否合理、首字节延迟(TTFB)是否可控。
一、先确认单请求 Brotli 在低配环境真实生效
很多问题源于配置未生效,而非性能不足:
- 用
curl -H "Accept-Encoding: br" -I https://your.site/app.js检查响应头是否有Content-Encoding: br和Vary: Accept-Encoding;缺失后者易导致 CDN 缓存错乱 - 对比同一 JS 文件关闭/开启 Brotli 时的
Content-Length,确认压缩比 ≥2.0(低端机建议设brotli_comp_level 4–6,避免 level 9 导致 CPU 长期满载) - 检查 Nginx 日志中
$brotli_ratio变量:>1 表示成功压缩;=1 多因文件太小(brotli_min_length默认 20 字节)、类型未匹配(务必含application/json)或被gzip_disable干扰 - 确保
gzip off;显式关闭 gzip,防止协商冲突——低端机上双压缩模块共存极易引发 CPU 竞争
二、模拟真实瓶颈压力,避开无效高并发
低端服务器扛不住纯 QPS 堆叠,应聚焦三类轻量但致命的压力场景:
-
CPU 持续饱和测试:用
hey -n 500 -c 50 -H "Accept-Encoding: br" https://your.site/index.html(50 并发压中等 HTML),同时运行top -p $(pgrep nginx)观察 worker 进程 CPU 是否持续 >85%;若此时$brotli_ratio从 2.8 降至 1.5,说明压缩质量已妥协,需降级 level -
小文件高频请求:压测
/api/health(返回约 300B JSON),启用brotli_min_length 20;关注 error.log 中是否出现大量brotli_ratio=1记录——这反映 Brotli 主动跳过,但若brotli_types未包含application/json,实际就是漏压缩 -
冷启动与 reload 敏感性:执行
nginx -s reload后立即发起 10 个 br 请求,记录首个请求的 TTFB;低端机常见现象是 reload 后前 2–3 个请求 TTFB 突增至 300ms+,说明 Brotli 字典加载或线程初始化有延迟,建议启用brotli_static always预加载 .br 文件
三、监控关键指标,定位真实瓶颈
不依赖图形化工具,用基础命令快速判断:
- 日志格式加入压缩指标:
log_format brotli '$remote_addr [$time_local] "$request" $status $brotli_ratio $request_length $bytes_sent';
之后用awk '{sum+=$5} END {print "avg ratio:", sum/NR}' access.log快速算平均压缩比 - 检查是否因压缩拖慢首字节:
对比开启 Brotli 前后,同一接口在curl -w "@format.txt" -o /dev/null -s下的time_starttransfer(即 TTFB)变化;若升高 >50ms,且 CPU 已高负载,说明该资源不适合动态压缩,应改用brotli_static on+ 构建时预压缩 - 观察连接堆积:
ss -tn state established | grep :443 | wc -l若稳定 >100,配合netstat -s | grep "listen overflows"非零,说明 worker 进程忙于压缩无法及时 accept 新连接——此时需调小worker_connections或启用multi_accept off
四、适配低端机的精简配置建议
避免“照搬生产配置”,做减法:
- 关闭非必要模块:
gzip off;、underscores_in_headers off;、禁用 Lua/OpenResty 插件 - Brotli 参数务实:
brotli on;<br> brotli_comp_level 5;<br> brotli_min_length 20;<br> brotli_types text/plain text/css application/json application/javascript;
- 静态资源强制预压缩:
brotli_static on;并确保构建时生成 .br 文件(如 vue-pure-admin 的VITE_COMPRESSION=brotli) - 限制单 worker 负载:
worker_processes 1;<br> worker_connections 512;<br> keepalive_timeout 15;











