Brotli 值得上,但别把它当成 gzip 的简单替换,静态文本资源用 q11 预压缩,动态接口在边缘用 q4-6,gzip 永远保留作回退,只盯压缩比,不看 CPU、TTFB 和缓存变体,最后大概率翻车。

Brotli压缩在CDN上怎么选,静态预压是甜点,动态压缩别硬上q11
Brotli 到底压了什么
Brotli 不是新发明的压缩哲学,核心还是 LZ77 系那一套:找重复串、编码、熵编码,区别在于它做了三件更狠的事:更大的滑动窗口、内置静态字典、更细的质量档位,gzip/DEFLATE 窗口通常 32KB,Brotli 最大可到 16MB,长文件里的重复片段更容易被抓住;静态字典里塞了大量 Web 常见词,HTML、CSS、JS 里的 function、background、Content-Type 这类字符串不用现学;质量参数 0-11,q11 压缩比最好但很慢,q4-5 速度接近 gzip 高压缩档,q1-3 适合极低延迟,浏览器侧通过 Accept-Encoding: br 协商,服务端返回 Content-Encoding: br;实际部署里还要注意,很多浏览器只在 HTTPS 下发 br。
方案对比:gzip、动态 Brotli、预压缩 Brotli
gzip 的优势是兼容性最好、CPU 便宜、工具链成熟,缺点是压缩比一般,Brotli 在文本上通常比 gzip 再小 15%-25%,小文件因为静态字典可能更明显,但 CPU 更贵,尤其 q11。
动态 Brotli:在 CDN 边缘实时压缩,优点是灵活,源站不用改,动态 HTML、JSON、API 响应都能覆盖,缺点是吃边缘 CPU,增加 TTFB;q11 绝对不能做动态默认,q4-6 才是现实选择,CDN 节点 CPU 已经很紧,动态 Brotli 会把延迟打上去。
预压缩 Brotli:构建时或源站生成 .br 文件,q11,CDN 直接缓存和回源,优点是压缩率最高,边缘几乎零 CPU,适合 JS、CSS、HTML、SVG 这类静态资源,缺点是发布流程多一步,存储多一份,缓存变体和回源逻辑要处理好。
源站动态压缩:不推荐作为主方案,源站既要处理业务又要压缩,CPU 和出口带宽双重压力,扩容成本高。
适用场景
适合 Brotli 的:HTML、CSS、JS、JSON、XML、SVG、纯文本,通常大于 1KB 才有意义,大文本、重复度高的前端 bundle、API JSON 收益明显。
不适合的:JPEG、PNG、WebP、AVIF、MP4、MP3、WOFF2、ZIP、GZIP 等已经压缩过的格式,再压一遍浪费 CPU,甚至可能变大。
高流量静态资源:预压缩 q11 是甜点,一次压缩,全网受益,动态 API:边缘 q4-5,低延迟场景 q1-3,旧客户端:保留 gzip 回退,不能只发 br,敏感响应:注意 BREACH 类攻击,动态压缩如果混合了秘密和用户输入,可能泄露信息,敏感页面应禁用或做缓解。
选型建议
第一,默认开启 Brotli + gzip 回退,HTTPS 优先,设置 Vary: Accept-Encoding,确保 CDN 缓存能区分 br、gzip、identity 变体,很多 CDN 会规范化 Accept-Encoding,但别假设它一定做对了。
第二,静态资源走预压缩,构建时生成 .br,质量 q11,窗口小文件 18-20,大文件 22-24,CDN 缓存 .br,源站保留原始文件,文件名带 hash,避免缓存污染。
在边缘压缩,质量 q4-6,窗口 18-20,最小长度 1KB,最大长度按业务设 1-10MB,避免大文件阻塞,监控边缘 CPU、TTFB p95、压缩率,CPU 超过阈值就降 q 或只对特定 MIME 开。
第四,缓存参数要统一,同一个 URL 不要一会儿 q5 一会儿 q11,否则缓存碎片化,命中率下降,CDN 缓存键和回源请求头要一致。
第五,看总账,不只看压缩比,带宽省了多少钱,边缘 CPU 花了多少,TTFB 涨了多少,缓存命中降了多少,做小流量 A/B,再全量,指标至少看:br 命中率、gzip 回退率、压缩率、边缘 CPU、首字节时间、带宽成本。
Brotli 不是银弹,它是 CDN 文本传输优化里很划算的一块,静态 q11 预压缩收益最大,动态 q4-5 是平衡,gzip 是保底,按内容类型、流量结构、CPU 余量和缓存能力选,才不会为了省几 KB 把边缘节点压垮。
发表评论