可通过 limit_req 指令结合 map 模块与 $http_user_agent 变量,为 PC、手机、平板等不同设备类型的静态资源请求设置独立限流策略:先用 map 提取 UA 特征映射为 $device_type,再分别定义 static_mobile 和 static_desktop 限流 zone,最后在 location 中按设备类型动态应用对应限流规则。

可以通过 limit_req 指令结合 Nginx 的变量(如 $http_user_agent)与 map 模块,为不同设备类型(PC、手机、平板)的静态资源请求设置独立的限流策略。
识别设备类型并映射限流区域
利用 map 指令从 User-Agent 提取设备特征,生成区分 PC/移动端的变量,并绑定到不同的限流 zone:
- 在
http块中定义映射关系,例如匹配常见移动 UA 特征(Mobile、Android、iPhone)标记为mobile,其余默认为desktop - 为每类设备创建独立的
limit_req_zone,使用该 map 变量作为 key,确保不同设备走不同限流桶 - 示例配置片段:
map $http_user_agent $device_type { ~*[Mm]obile|Android|iPhone|iPad|Windows\sPhone mobile; default desktop; } limit_req_zone $device_type zone=static_mobile:10m rate=10r/s; limit_req_zone $device_type zone=static_desktop:10m rate=50r/s;注意:两个 zone 名称必须不同,且 key 值($device_type)需一致才能正确路由
在 location 中按设备应用对应限流规则
针对静态资源路径(如 /static/、.js、.css 等),在 location 块中根据 $device_type 动态调用 limit_req:
- 用
if判断设备类型后执行不同限流指令(Nginx 1.19+ 支持limit_req在 if 内使用) - 更推荐方式:将限流逻辑拆到独立
location或用try_files+ 内部重定向间接实现,避免 if 性能隐患 - 简易安全写法(兼容旧版本):
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?)$ { limit_req zone=static_$device_type burst=20 nodelay; }前提是 zone 名已按static_mobile/static_desktop预定义,且变量拼接合法(需确认 Nginx 版本支持)
精细化控制:区分静态资源类型与设备组合
若需对「移动端图片」和「PC端 JS」设置完全不同的速率,可扩展 map 维度:
- 新增一个 map,将
$device_type与文件后缀组合,生成复合 key,如mobile_js、desktop_css - 为每个组合定义专属 zone,例如:
limit_req_zone $device_ext zone=static_mobile_js:10m rate=5r/s - 在匹配静态资源的 location 中,先通过 map 得到
$device_ext,再统一调用limit_req zone=$device_ext - 注意内存开销:每个 zone 占用固定内存,组合过多会增加资源消耗,建议按实际瓶颈资源(如大图、字体)重点限流
验证与调试关键点
上线前需确认限流是否按预期生效:
- 用 curl 模拟不同 UA 请求,检查响应头是否含
X-RateLimit-Limit和X-RateLimit-Remaining(需配合limit_req_status和自定义 header) - 查看 Nginx error log,过滤
limiting requests关键字,确认触发的是哪个 zone - 对移动端 UA 请求,观察是否被
static_mobilezone 限制;更换 UA 后应切换至static_desktop行为 - 注意缓存干扰:CDN 或浏览器缓存可能绕过 Nginx 限流,测试时添加随机查询参数或禁用缓存

















