最简单有效的测试方式是直接修改gzip_comp_level并观察响应时间变化,需结合日志中$body_bytes_sent和$request_time分析真实用户耗时,过滤有效请求后分组对比不同级别下的体积与延迟指标,并辅以压测验证cpu与性能的平衡点。

直接改 gzip_comp_level 并观察响应时间变化,是最简单有效的测试方式。关键不是看“压了多少”,而是看用户实际收到完整响应花了多久——这需要结合日志指标和可控实验来验证。
用 Nginx 日志抓真实耗时与体积
先确保日志格式包含两个核心字段:$body_bytes_sent(发给用户的压缩后字节数)和 $request_time(用户侧总延迟)。在 http 块中定义:
log_format gzip_test '$remote_addr [$time_local] "$request" $status $body_bytes_sent $request_time "$http_accept_encoding" $upstream_response_time';
access_log /var/log/nginx/gzip_test.log gzip_test;
注意过滤掉无效请求:
• 只分析 $http_accept_encoding 包含 gzip 的行
• 排除 $upstream_response_time 远大于 $request_time 的请求(说明瓶颈在后端,压缩影响小)
• 跳过图片、视频等本就不该压缩的资源(它们的 $body_bytes_sent 不应变化)
分组对比不同 level 下的关键指标
每次只改一个 gzip_comp_level 值(如 3、5、6、8),reload Nginx 后运行 1–2 小时,再用日志对比:
- 相同 URL、相似请求体大小下,
$body_bytes_sent的平均值是否明显下降(比如从 120KB → 85KB) -
$request_time超过 1 秒的请求数量是否减少(尤其对 50KB+ 的 HTML/JSON) - 大响应(如
$body_bytes_sent > 100000)的中位耗时变化趋势
别只看平均值——高压缩级别可能让小请求变慢,却对大响应收效甚微。重点看 P90/P95 耗时是否优化。
搭配压测工具做定向验证
用 ab 或 wrk 对典型接口发起固定 QPS 请求,例如:
wrk -t4 -c100 -d30s --latency "http://your.site/api/report"
分别在 level 4、6、8 下跑三次,记录:
• 实际 QPS 是否稳定
• 平均延迟与长尾延迟(如 99%ile)
• Nginx 工作进程 CPU 使用率(top -p $(pgrep nginx))
你会发现:level 6 比 4 多省约 10% 体积,但 CPU 上升 20%;level 8 体积几乎不降,CPU 却翻倍,QPS 反而下跌。
避开干扰项,确认压缩真起效
常见误判点:
- 没开
gzip_vary on:CDN 或代理可能缓存未压缩版本,导致部分用户看到空白页或乱码 - 误加
image/*到gzip_types:JPEG/PNG 本身已压缩,再压徒增 CPU,体积不变 - HTTPS 握手慢掩盖收益:若
$ssl_handshake_time(需 Nginx ≥ 1.19.2)普遍 > 300ms,压缩收益会被掩盖 - 后端返回已压缩内容:如 Spring Boot 配了
Content-Encoding: gzip,Nginx 再压会失败或绕过缓存











