压缩是性价比最高的性能优化:文本资源一般能缩到原大小的 15%–35%,配置只要几行,改完立刻生效。但有两个常见误区——对已经压过的图片、视频、woff2 再压一遍纯属浪费 CPU;忘了发 Vary: Accept-Encoding,会让 CDN 把压缩版当缓存对象发给不支持压缩的客户端。
带宽与费用节省估算
gzip 和 Brotli 到底该用哪个
不是二选一,而是同时开,让浏览器自己挑。浏览器在请求头里带 Accept-Encoding: gzip, deflate, br,服务器按优先级选一个返回,同时必须回 Vary: Accept-Encoding,否则中间缓存可能把 Brotli 版本发给只支持 gzip 的老客户端,那串乱码就是这么来的。
两者体积差距没有想象中悬殊:Brotli 通常比 gzip 再小 15%–25%,对 HTML、CSS、JS 这类重复模式多的文本更明显。Brotli 的静态字典(内置了常见 HTML 与 JS 片段)是它压缩率高的主要原因,代价是压缩时更费 CPU。
级别怎么选
| 场景 | Gzip 级别 | Brotli 质量 | 说明 |
|---|---|---|---|
| 动态压缩(每次请求现压) | 5 – 6 | 4 – 5 | 性价比区间。级别从 6 提到 9,体积通常只少 1%–2%,CPU 却成倍上升 |
| 静态预压缩(发版时压一次) | 9 | 10 – 11 | CPU 只花一次,值得拉满,配合 gzip_static / brotli_static 直接发文件 |
| 高并发小内存机器 | 4 – 5 | 关闭或 4 | 压缩是 CPU 密集操作,先保证响应时间 |
典型压缩率参考
下面这些是常见量级,实际值取决于内容重复度与是否已压缩:HTML 压到原大小的 20%–30%、CSS 15%–25%、JavaScript 25%–35%、JSON 10%–25%、SVG 20%–35%。
反过来说,以下类型不要开压缩:JPEG、PNG、WebP、AVIF、GIF、MP4、WebM、MP3、WOFF2、ZIP、7z、以及 .gz / .br 本身。它们已经是压缩格式,二次压缩收益接近零,甚至因为头部开销而变大,白烧 CPU。
还有两个容易忽略的点
- 最小长度门槛。小于 1KB 的响应压缩后可能更大,设 gzip_min_length 1024 把这类小响应排除掉。
- 压缩不能替代缓存。压缩省的是带宽,缓存省的是请求。发版时给带内容哈希的静态资源设 Cache-Control: public, max-age=31536000, immutable,和压缩叠加才是完整方案。
你可能还想问
压缩质量设多少合适?
图片常用中高质量兼顾体积与观感,文本压缩越高越省空间但耗时越长;关键是按用途定目标,而不是一味追高压缩率。
无损和有损怎么选?
需要反复编辑或归档用无损,追求传输体积用有损;有损压缩不可逆,重要原图务必保留未压缩副本。
生成的配置怎么验证?
拿典型样本压一遍,对比体积与质量,再检查是否被目标软件正确读取;配置能跑通不等于效果达标,必须实测。
速查在线工具箱