nginx可通过map指令基于请求头、url路径、客户端网络类型等动态控制压缩开关、算法选择及压缩级别,并支持向后端透传请求体压缩标识以协同解压。

可以利用 Nginx 的 map 指令,结合请求头、URL 路径、客户端类型等特征,动态控制是否启用压缩以及使用哪种压缩算法或级别,从而在节省带宽的同时避免对高 CPU 负载场景造成额外压力。
基于请求头特征动态启用 gzip 或 brotli
Nginx 本身不直接支持按请求动态切换压缩算法,但可通过 map 提取客户端能力,并配合 gzip/brotili 模块的条件开关实现策略分流:
- 先用
map判断Accept-Encoding是否包含br,并标记变量 - 再在
location或server块中,用if ($use_brotli) { ... }或更推荐的gzip off+brotili on组合控制 - 注意:
brotili需提前编译启用,且仅对响应体生效(Nginx 不压缩请求体)
示例配置:
map $http_accept_encoding $use_brotli {
~*br 1;
default 0;
}
<p>server {
gzip on;
gzip_types application/json text/plain;
brotli on;
brotli_types application/json text/plain;</p><pre class="brush:php;toolbar:false;"># 若客户端支持 br,则禁用 gzip,启用 brotli
if ($use_brotli) {
gzip off;
brotli on;
}}
按请求路径或参数控制压缩开关
对静态资源(如 /static/)、API 接口(如 /api/v1/)或含特定查询参数(如 ?compress=off)的请求,可差异化启用压缩:
- 用
map解析$request_uri或$args,生成布尔变量如$enable_compression - 在
http或server块中统一设置gzip $enable_compression(需 Nginx ≥ 1.19.7) - 对图片、视频等二进制资源,即使匹配 MIME 类型也应设为
off,避免无效压缩
示例:
map $request_uri $enable_compression {
~^/api/ 1;
~^/static/ 1;
default 0;
}
<p>gzip $enable_compression;</p>按客户端网络类型调节压缩级别
借助 map 解析 User-Agent 或自定义 header(如前端注入的 X-Network-Type: 4g),可为弱网用户启用更高压缩比,为局域网用户降低 CPU 开销:
- 定义变量
$gzip_level,映射不同网络场景到 1–9 级(gzip.dll 支持 0–10) - 设置
gzip_comp_level $gzip_level,注意该指令不支持变量直接赋值,需配合if+ 多级gzip_comp_level块(Nginx ≤ 1.18)或升级至支持变量的版本 - 更稳妥做法:用
map分流到不同location,各 location 内设固定gzip_comp_level
与后端协同实现请求体压缩识别
Nginx 默认不压缩请求体,但可通过 map 标记客户端是否声明了 Content-Encoding: gzip,再透传给后端做解压决策:
- 定义
map $http_content_encoding $is_gzip_request { ~gzip 1; default 0; } - 用
proxy_set_header X-Compressed-Request $is_gzip_request通知后端 - 后端据此决定是否调用 gzip 解码器,避免对未压缩请求误处理
这种协作方式让压缩策略真正“动态”——由客户端发起、Nginx 标记、后端执行,全程可观察、可灰度、可回退。










