Nginx 的 map 指令通过特征识别(如 User-Agent、Accept-Encoding、自定义 Header)动态生成变量,实现对 /api/secure/ 等加密路径的差异化压缩控制,包括启用/禁用、算法切换、级别调整及绕过压缩以降低 CPU 负载。

Nginx 的 map 指令本身不执行压缩或降级动作,而是通过提取客户端软硬件特征(如 User-Agent、Accept-Encoding、自定义 Header 等),生成可被后续指令引用的变量,从而在运行时动态控制压缩行为——包括对特定加密路径(如 /api/secure/)启用/禁用压缩、切换算法、调整压缩级别,甚至完全绕过压缩以降低 CPU 负载。关键在于“特征识别 → 变量映射 → 条件响应”,而非硬编码开关。
针对加密路径的压缩策略动态降级
只对匹配 /api/secure/ 的请求应用差异化压缩逻辑,避免影响其他路径。需在 location 中限定作用域,并配合 map 提前生成决策变量。
-
在
http块中定义压缩控制变量,例如:map $request_uri $enable_secure_compression { ~^/api/secure/ 1; default 0; } map $http_accept_encoding $use_brotli { ~*br 1; default 0; } map $http_user_agent $is_low_power_device { ~*(iPhone|Android.*WebView|MiuiBrowser|UCBrowser) 1; ~*(curl|httpie|wget) 0; # CLI 工具通常不介意体积,但需更高兼容性 default 0; } -
在
location /api/secure/中组合判断,实现分级降级:location /api/secure/ { # 仅当路径匹配且客户端非低功耗设备时才考虑压缩 if ($enable_secure_compression = 0) { gzip off; brotli off; break; } # 低功耗设备:禁用压缩,避免 CPU 过载 if ($is_low_power_device = 1) { gzip off; brotli off; add_header X-Compression "disabled: low-power-device" always; break; } # 支持 Brotli 且非低功耗:优先用 Brotli if ($use_brotli = 1) { gzip off; brotli on; brotli_comp_level 6; add_header X-Compression "brotli:6" always; } # 否则回退 gzip,但限制级别(避免旧设备解压失败) if ($use_brotli = 0) { gzip on; gzip_comp_level 4; brotli off; add_header X-Compression "gzip:4" always; } proxy_pass http://backend; }
根据软硬件特征做更细粒度的压缩降级
-
CPU 敏感型设备识别:除 UA 外,可结合前端注入的
X-Device-Capability: cpu=low或X-Network-Type: 2g等自定义头:map "$http_x_device_capability:$http_x_network_type" $compress_aggressively { ~*cpu=low:.+ 0; ~*.+:2g 0; ~*cpu=high:.+ 9; default 5; }再配合
gzip_comp_level $compress_aggressively(需 Nginx ≥ 1.19.7)或用if分块设置。 -
规避无效压缩:对已压缩的请求体(如
Content-Encoding: gzip),应跳过响应压缩,防止二次压缩损坏数据:map $http_content_encoding $skip_response_compress { ~*(gzip|br|deflate) 1; default 0; } # 在 location 中: if ($skip_response_compress = 1) { gzip off; brotli off; }
注意事项与避坑点
-
map必须定义在http{}块内,不能嵌套在server或location中 -
gzip_comp_level和brotli_comp_level不支持直接变量赋值(旧版 Nginx),推荐用if+ 多级固定值,或升级至支持变量的版本 -
gzip off和brotli on不能共存于同一上下文,必须显式互斥关闭 - 所有
map必须设default,否则未匹配时变量为空,可能导致502或配置失效 - 加密路径常伴随敏感数据,启用压缩前需确认无 BREACH 类风险;若存在 CSRF Token 等可预测内容,建议整体禁用压缩
不复杂但容易忽略


















