Nginx卡顿主因常是gzip_comp_level过高(7–9)导致CPU持续超载,而非worker_connections不足;应监控CPU占用与请求延迟强关联、检查误压图片等已压缩资源、验证gzip_buffers是否过小,并通过A/B压测确认优化效果。

直接看 CPU 使用率和请求延迟就能发现 gzip_comp_level 过高引发的卡顿——这不是隐蔽问题,而是会立刻在监控指标上“跳出来”的典型资源争抢现象。
盯住 CPU 占用与请求耗时的强关联
当 nginx 的 gzip_comp_level 设为 7–9 时,大响应体(如 >100KB 的 JSON 或 HTML)压缩过程会持续占用单个 worker 进程的 CPU 时间,导致明显可测的性能拐点:
- 在 Prometheus + Grafana 或 Nginx 自带 stub_status 中,观察 worker 进程 CPU 使用率是否频繁冲高至 80%+,且与
gzip_ratio高的请求时段完全重合 - 对比相同接口在不同压缩级别下的 P95 延迟:比如 level 6 平均 80ms,level 9 突增至 320ms,且延迟分布出现长尾(>500ms 请求占比明显上升)
- 启用
nginx -V 2>&1 | grep -o with-http_realip_module确认已编译 realip 模块后,在 access_log 中加入$request_time $upstream_response_length $gzip_ratio,用日志分析工具(如 GoAccess 或自定义脚本)筛选出gzip_ratio > 0.7且request_time > 200ms的请求,它们大概率来自高 comp_level 压缩
检查压缩是否在错误对象上生效
gzip 对已压缩格式(如 .jpg、.webp、.mp4)无效,反而徒增 CPU 开销。监控中若发现这些资源的响应时间异常偏高,说明 gzip_types 和 gzip_disable 配置有漏洞:
- 在 access_log 中统计
$sent_http_content_encoding字段,确认image/jpeg或video/mp4响应是否错误地返回了gzip - 用 curl 测试:
curl -I -H "Accept-Encoding: gzip" https://yoursite.com/logo.jpg,若返回Content-Encoding: gzip,即配置失效,需立即补上gzip_disable "\.jpg\|\.jpeg\|\.png\|\.webp\|\.gif"; - 结合 Nginx error_log 中的
gzip: skipped或gzip: invalid encoding日志,定位被误压或跳过的资源类型
观察连接堆积与缓冲区等待
高 comp_level 会让单次压缩阻塞更久,导致 worker 进程无法及时处理新连接,尤其在并发突增时:
- 通过
ss -n state established | wc -l和nginx -t -c /etc/nginx/nginx.conf && nginx -V 2>&1 | grep 'worker_processes'推算理论最大连接数,再比对Active connections(来自 stub_status),若长期接近上限但Writing数值偏高,说明压缩阻塞了写入阶段 - 检查
gzip_buffers设置是否过小(如仍用默认32 4k),导致频繁内存分配;改用16 8k后,监控中malloc调用次数应明显下降 - 启用
nginx -V 2>&1 | grep -o with-http_stub_status_module后,定期抓取 stub_status 输出,计算Writing / Active比值——该值 > 0.3 且持续上升,是压缩阻塞的强信号
用真实流量做 A/B 压测验证
最直接的方式:临时切出 10% 流量,将 gzip_comp_level 从 9 降到 3,其他配置不变,用监控对比关键指标变化:
- 使用 Nginx 的
split_clients指令分流,或借助 CDN 的灰度能力 - 重点看三组数据:CPU 平均负载下降幅度、P95 延迟降低比例、每秒成功响应数(req/sec)提升值
- 若降级后 CPU 降 35%、延迟降 58%、吞吐升 22%,即可确认原级别严重过载,无需进一步怀疑


















