nginx的map指令通过动态生成变量实现运行时压缩策略:按终端类型降级gzip级别、按资源类型跳过无效压缩、按网络标识切换轻量模式,需nginx≥1.19.7支持变量赋值。

Nginx 的 map 指令是实现运行时动态压缩策略的核心工具,它不直接执行压缩,而是根据客户端软硬件特征(如 User-Agent、设备类型、网络标识等)生成控制变量,再交由 gzip 或 brotli 模块按需启用、禁用或调整参数。对静态资源做压缩降级,本质是:在 CPU 负载高、终端能力弱或网络条件差时,主动降低压缩强度甚至跳过压缩,以换取响应速度与稳定性。
以下为可直接落地的三类典型场景及配置逻辑:
按终端类型降低压缩级别
移动端 WebView、旧版浏览器或嵌入式设备解压能力有限,高阶压缩(如 gzip_comp_level 9)反而增加首字节延迟。用 map 提取 UA 特征,映射出适配的压缩等级:
map $http_user_agent $gzip_level {
default 6;
~*Android 4;
~*iPhone|iPad 4;
~*MSIE|Trident 3;
~*UCBrowser 4;
}
在 server 或 location 块中使用(注意:gzip_comp_level 自 Nginx 1.19.7 起支持变量,低版本需配合 if + 多级 gzip_comp_level 块):
gzip on; gzip_types text/css application/javascript application/json; gzip_comp_level $gzip_level;
按请求路径与资源类型跳过压缩
并非所有静态资源都适合压缩。图片(.jpg, .png, .webp)、视频、字体文件本身已是高压缩格式,再 gzip 不仅无效,还浪费 CPU。可通过 map 结合 $request_uri 或 $sent_http_content_type 实现精准排除:
map $request_uri $skip_compression {
~*\.(?:jpe?g|png|gif|webp|bmp|ico|woff2?|eot|ttf|mp4|avi|mov)$ 1;
default 0;
}
# 在 location 中统一控制
location ~ \.(css|js|json|html|xml|txt)$ {
gzip $skip_compression; # 为 1 时 gzip off;为 0 时按全局 gzip 配置生效
}
⚠️ 注意:gzip 指令接受布尔变量(on/off),该写法要求 Nginx ≥ 1.19.7。
按客户端网络标识启用轻量压缩模式
若前端能注入自定义 header(如 X-Network-Type: 4g 或 X-Device: low-end),可用 map 组合判断,为弱网设备强制切换至更轻量的压缩算法或关闭 brotli:
map "$http_x_network_type:$http_user_agent" $use_light_gzip {
~*^4g:.*Android|iOS 1;
~*^low-end: 1;
default 0;
}
map $use_light_gzip $brotli_switch {
1 off;
0 on;
}
# 启用 brotli,但按条件关闭
brotli on;
brotli_types text/plain application/json;
brotli_comp_level 6;
brotli on; # 此处实际被变量覆盖,需配合 if(见下)
if ($brotli_switch = "off") {
brotli off;
gzip_comp_level 3;
}
✅ 提示:
brotli模块不支持变量直赋,必须用if控制开关;同时建议搭配gzip_vary on,确保 CDN 或代理能正确缓存不同压缩版本。
不复杂但容易忽略











