gzip和brotli压缩怎么选?看内容类型和客户端支持
先看结论:没有绝对更好,只有更适合
如果你的网站已经启用 HTTPS,且主要用户使用近几年的 Chrome、Firefox、Edge 或 Safari,优先为静态文本资源开启 Brotli,同时保留 Gzip 作为回退,是兼顾压缩率和兼容性的做法。
如果站点仍有大量老客户端、老旧安卓 WebView,或者服务端 CPU 资源紧张、又不想额外安装模块,Gzip 更省事也更稳。
两者都是 HTTP 内容编码,不是图片压缩格式。
它们只对 HTML、CSS、JavaScript、JSON、SVG 等文本资源有效,对 JPEG、PNG、WebP、MP4 这类已压缩文件基本没有收益。
压缩率与兼容性怎么权衡
Brotli 使用更复杂的字典和上下文建模,在相同资源上通常比 Gzip 得到更小的体积,尤其是 CSS 和 JavaScript 文件。
代价是压缩时 CPU 开销更高,解压时开销相对可控。
Gzip 的优势是支持范围广,几乎所有 HTTP 客户端都能处理,服务端模块也通常默认可用。
一个实际判断条件是:看你的访问日志里 User-Agent 的分布。
如果绝大多数请求来自现代浏览器,Brotli 的兼容性风险很低;
如果仍有大量旧版系统或嵌入式浏览器,Brotli 可能不被识别,客户端会回退到未压缩或 Gzip,具体取决于服务端配置。
另外,Brotli 在浏览器端通常要求 HTTPS 才能被协商使用,HTTP 明文站点即使服务端开启,客户端也不一定接受。
这一点在配置前要先确认。
Nginx 上怎么配置和验证
以下示例适用于常见 Linux 发行版上的 Nginx,前提是你有权限修改站点配置并重载服务。
操作前先备份原配置文件。
开启 Gzip
在 http、server 或 location 块中加入:
gzip on;
gzip_types text/plain text/css application/javascript application/json image/svg+xml;
gzip_min_length 1024;
gzip_comp_level 5;
gzip_min_length 避免压缩过小的文件,gzip_comp_level 取 5 左右是压缩率和 CPU 开销的常见折中。
改完后执行 nginx -t 检查语法,再 nginx -s reload 重载。
开启 Brotli
Nginx 默认不一定带 Brotli 模块,需要确认已安装 ngx_brotli 或发行版提供的 Brotli 模块。
配置示例:
brotli on;
brotli_types text/plain text/css application/javascript application/json image/svg+xml;
brotli_comp_level 6;
brotli_min_length 1024;
如果模块未安装,nginx -t 会报未知指令,此时不要强行写入生产配置,先安装对应模块或改用 Gzip。
验证实际返回的编码
用 curl 带 Accept-Encoding 请求头检查响应头:
curl -I -H "Accept-Encoding: gzip, br" https://你的域名/static/app.js
观察返回头中的 Content-Encoding。
如果返回 br,说明 Brotli 生效;
返回 gzip 说明走了 Gzip;
没有该头则说明未压缩。
也可以对比压缩前后 Content-Length 的变化,但注意分块传输时该头可能不存在。
容易踩坑的几个地方
- 不要对图片、视频、压缩包开启文本压缩,浪费 CPU 且收益接近零。
- 动态接口谨慎开启 Brotli 高压缩级别,高并发下 CPU 可能成为瓶颈;静态资源适合预压缩或中等压缩级别。
- CDN 回源和边缘压缩要分开看,源站开了 Brotli 不代表 CDN 边缘一定按 Brotli 返回,需要查看 CDN 的压缩配置和缓存键是否包含
Accept-Encoding。 - 测试时清缓存或带随机参数,避免拿到旧缓存结果误判。
常见疑问
Brotli 能完全替代 Gzip 吗?
不能。老客户端和不支持 Brotli 的工具链仍需要 Gzip 回退,同时开启两者是常见做法。
开了 Brotli 后页面变慢是怎么回事?
先看服务端 CPU 和压缩级别。动态内容用高压缩级别、或对大量小文件逐个压缩,都可能增加响应时间。静态资源可考虑构建时预压缩。
HTTP 站点能用 Brotli 吗?
浏览器端通常要求 HTTPS 才协商 Brotli,HTTP 站点建议以 Gzip 为主。
压缩级别越高越好吗?
不是。级别越高 CPU 开销越大,压缩收益递减。静态资源可以离线预压缩到较高级别,动态响应建议用中等偏低级别。