可同时启用 Brotli 和 Gzip 实现优雅降级:客户端通过 Accept-Encoding 自动选择,服务端需确认 ngx_brotli 模块已加载,配置 brotli on 与 gzip on 并开启 _static 和 _vary,优先使用预压缩文件,精准设置压缩类型、最小长度及级别。

可以同时启用 Brotli 和 Gzip,但不是让它们一起压缩同一个响应,而是靠客户端的 Accept-Encoding 头自动选择——支持 br 的用 Brotli,不支持的自动回退到 Gzip。这种机制叫“优雅降级”,服务端无需判断 UA,浏览器自己协商,零感知、全兼容。
确认 Brotli 模块已加载
Nginx 默认不带 Brotli 支持,必须确认 ngx_brotli 模块已编译或动态加载:
- 运行
nginx -V 2>&1 | grep -o ngx_brotli,有输出说明模块就位 - 若无输出,需换用含该模块的镜像(如
tiangolo/nginx-brotli),或重新编译 Nginx 并添加--add-module - 不建议源码编译时漏掉
git submodule update --init,否则模块初始化失败
基础双压缩配置(写在 http 块)
以下配置实现标准协商逻辑,不冲突、不冗余:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
-
brotli on;+brotli_static on;:启用 Brotli,且优先查找预生成的.br文件 -
brotli_types明确列出要压缩的 MIME 类型,例如:text/css application/javascript image/svg+xml -
gzip on;+gzip_static on;:启用 Gzip,同样依赖预生成的.gz文件 -
gzip_types与brotli_types保持一致,确保兜底路径覆盖相同资源类型 - 必须同时开启
gzip_vary on;和brotli_vary on;,让 Nginx 返回Vary: Accept-Encoding,避免 CDN 或代理缓存错版本
推荐使用静态预压缩而非实时压缩
高并发下动态压缩(brotli on 但无 .br 文件)会显著抬升 CPU,尤其 Brotli 级别设高时。更优做法是构建阶段预生成:
- 用命令批量生成:
find ./dist -type f \( -name "*.js" -o -name "*.css" -o -name "*.html" \) -exec brotli --quality=9 --output={}.br {} \; - 同理生成
.gz:gzip -k -9 *.js *.css - Nginx 只需确保对应文件存在,
_static on就会跳过实时编码,TTFB 更稳定
压缩类型与阈值要精准控制
乱压不仅无效,还浪费 CPU:
- 只压缩文本类资源:
text/plain、application/json、image/svg+xml等;禁压.jpg、.png、.mp4、.pdf等已压缩二进制格式 - 设最小长度门槛:
brotli_min_length 512;、gzip_min_length 1024;,避免为几十字节响应开销 - 级别建议:
brotli_comp_level 7–9(7 级已超 gzip 9 级)、gzip_comp_level 6(平衡率与开销)










