Nginx HTTP/2下可同时启用Gzip与Brotli,但需通过第三方模块支持Brotli;二者不叠加压缩,而是依Accept-Encoding协商选择,Brotli优先、Gzip兜底。

在 Nginx 的 HTTP/2 环境下,同时启用 Gzip 和 Brotli 压缩是可行的,但需注意:Nginx 官方模块 不原生支持 Brotli,必须通过第三方模块(如 google/ngx_brotli)编译安装;而 Gzip 是内置功能,开箱即用。两者不能“同时作用于同一响应”,Nginx 会根据客户端的 Accept-Encoding 自动选择最匹配的一种(优先级由模块配置决定),因此合理配置才能让 Brotli 在支持时生效、Gzip 作为兜底。
确认并启用 Brotli 模块(前提条件)
Brotli 不是 Nginx 默认组件。若未安装 ngx_brotli,所有 Brotli 配置均无效:
- 检查是否已加载:
nginx -V 2>&1 | grep -o ngx_brotli,无输出说明未编译进内核 - 推荐使用预编译包(如 Ubuntu 的
nginx-extras包含 Brotli)或从源码编译:google/ngx_brotli,需同步下载 brotli 库 - 验证模块加载成功后,在
http或server块中添加:brotli on;brotli_types text/plain text/css text/javascript application/javascript application/json application/xml+rss;
Gzip 与 Brotli 的共存逻辑与优先级控制
Nginx 不会叠加压缩,而是按 Accept-Encoding 头协商。关键点在于:Brotli 模块默认 优先级高于 Gzip,只要客户端声明支持 br,且响应 MIME 类型匹配,就用 Brotli;否则回落到 Gzip(如果启用且类型匹配):
- 确保 Gzip 未覆盖 Brotli:不要设置
gzip_disable "msie6";等可能干扰协商的指令 - 显式声明 Brotli 优先:无需额外操作,ngx_brotli 默认行为即如此;若需强制禁用 Brotli 可加
brotli off; - 验证协商结果:用
curl -H "Accept-Encoding: br,gzip" -I https://yoursite.com/style.css查看响应头中的Content-Encoding: br或gzip
HTTP/2 下的压缩配置要点(避坑提醒)
HTTP/2 自带 HPACK 头部压缩,但不影响响应体压缩(Gzip/Brotli)。需注意:
-
禁用对 HTTP/2 的重复压缩尝试:Nginx 1.13.6+ 已优化,但旧版本建议关闭
gzip_vary off;(非必需,但可减少 Vary 头冗余) - 避免压缩已压缩资源:添加
gzip_disable "msie6";同时,建议排除图片、视频等二进制文件(Brotli 同理),仅对文本类启用 - 启用
gzip_static on;和brotli_static on;可直接提供预压缩的.gz或.br文件,提升性能(需提前用gzip -k/bro --quality 11生成)
完整示例配置(精简可用)
放在 http{} 块中即可:
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css text/js application/javascript application/json application/xml+rss;
brotli_static on;
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_comp_level 6;
gzip_types text/plain text/css text/javascript application/javascript application/json application/xml+rss;
gzip_static on;
# 确保不干扰协商
gzip_disable "msie6";


















