关键是要分场景、控粒度、选算法、避干扰:文本类资源推荐gzip_comp_level 6以平衡压缩率与延迟,图片音视频等本身高压缩格式应禁用gzip,小文件(

要兼顾高压缩率与低延迟,关键不是一味提高压缩级别,而是分场景、控粒度、选算法、避干扰——压缩本身会增加 CPU 计算和响应时间,但合理配置能让它“省带宽不拖速度”。
按内容类型差异化启用压缩
不是所有资源都值得压缩,也不是所有压缩都该用同一级别:
-
文本类资源(HTML/CSS/JS/JSON/XML):必须压缩,推荐
gzip_comp_level 6—— 压缩率约 60%~70%,CPU 开销适中,是延迟与体积的最优平衡点;级别 9 虽然多压 3%~5%,但 CPU 时间翻 4~5 倍,首字节延迟明显上升。 -
图片(JPEG/PNG/GIF)、音视频、字体文件:默认禁用压缩(不在
gzip_types中),它们本身已是高压缩格式,再 gzip 反而增大体积、白耗 CPU。 - 小文件(:设
gzip_min_length 500,避免为几行 JS 或内联样式启动压缩流程,减少毫秒级抖动。
优先启用 Brotli 替代 Gzip(如已编译支持)
Brotli 是更现代的压缩算法,在同等 CPU 消耗下比 Gzip 多压 17%~25%,尤其适合文本。启用后,Gzip 可作为兜底兼容方案:
- 添加模块后配置:
brotli on; brotli_comp_level 8; brotli_types text/plain application/json application/javascript text/css; - 保持
gzip on不关闭,确保不支持 Brotli 的旧客户端(如部分嵌入式设备)仍能降级使用 Gzip。 - 注意:
brotli_min_length可设为 20 字节,比 Gzip 更激进,因 Brotli 启动开销更低。
压缩相关参数协同优化,减少延迟放大
压缩只是链路一环,若其他配置拖后腿,再好的压缩也白搭:
-
gzip_vary on必须开启:让 CDN 或代理缓存区分 gzip/non-gzip 版本,避免缓存污染导致重复压缩或解压失败。 -
tcp_nodelay on配合启用:禁用 Nagle 算法,防止压缩后的数据包被缓冲等待合并,保障小响应(如 API JSON)快速发出。 - 关闭冗余日志:
access_log off或启用缓冲日志,避免压缩节省的毫秒被磁盘 IO 吞掉。 - 静态资源路径启用
sendfile on和tcp_nopush on:对已压缩文件走零拷贝传输,跳过用户态内存复制,进一步缩短响应路径。
验证与监控:别信配置,要看真实延迟
调优后务必实测首字节时间(TTFB)和完整加载耗时:
- 用
curl -H "Accept-Encoding: gzip" -o /dev/null -s -w "TTFB: %{time_starttransfer}s\nSize: %{size_download} bytes\n" https://yoursite.com/app.js对比开启/关闭压缩的 TTFB 差异。 - 在 Chrome DevTools → Network 中查看资源的
Content-Encoding: gzip或br响应头,确认实际生效。 - 监控 Nginx worker CPU 使用率:若压缩导致某 worker 持续 >70%,说明压缩负载不均,需检查是否缺少
worker_cpu_affinity绑核或考虑降低gzip_comp_level。











