nginx可通过map指令基于$http_user_agent等变量识别客户端类型,并在location中结合limit_rate或limit_req实现差异化限速;需在http块预定义映射,再于location中引用变量控制带宽或请求频次,推荐叠加ip维度增强可靠性。

在 Nginx 中,location 本身不直接识别“客户端类型”(如移动端、PC 浏览器、爬虫等),但可以通过 $http_user_agent、$http_referer 或自定义请求头等变量,结合 map 指令预先分类,再将结果注入 limit_rate 或 limit_req,实现在 location 块中对不同客户端类型的差异化限速。
用 map 按 User-Agent 区分客户端类型
先在 http 块中定义映射关系,把常见 UA 字符串归类为 mobile、desktop、bot 等标签,并赋予对应限速值:
示例配置:
map $http_user_agent $client_type {
default "desktop";
"~*android|iphone|ipad|mobile" "mobile";
"~*curl|wget|python-requests|go-http-client" "bot";
"~*bingbot|googlebot|yandexbot" "search_bot";
}
该映射支持正则匹配,区分大小写(~* 表示忽略大小写),值可直接用于后续限速指令。
在 location 中绑定客户端类型限速
限速分两类:响应流速(limit_rate)和请求频次(limit_req),二者可独立或组合使用。
-
按类型限制下载带宽(适合 /download/ 类路径):
例如移动端限 256KB/s,爬虫限 64KB/s,普通桌面不限速:
location ^~ /download/ {
limit_rate $client_rate;
}
<p>map $client_type $client_rate {
default 0; # 不限速
"mobile" 256k;
"bot" 64k;
"search_bot" 32k;
}</p>
-
按类型限制请求频率(适合 API 接口):
需先定义限速区域,再用变量引用 zone 名称(Nginx 1.13.10+ 支持变量 zone 名):
map $client_type $req_zone_name {
default "desktop_zone";
"mobile" "mobile_zone";
"bot" "bot_zone";
}
<p>limit_req_zone $binary_remote_addr zone=desktop_zone:10m rate=20r/s;
limit_req_zone $binary_remote_addr zone=mobile_zone:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=bot_zone:10m rate=2r/s;</p><p>location /api/ {
limit_req zone=$req_zone_name burst=5 nodelay;
}</p>
注意:变量 zone 名需确保对应区域已定义,否则启动会报错。
补充增强策略:结合 IP + UA 双维度
仅靠 UA 易伪造,生产环境建议叠加 IP 限制提升可靠性:
- 用
geo或map标记高风险 IP 段(如已知代理池、IDC 出口) - 再用嵌套 map 综合判断:
$client_type和$is_suspicious_ip共同决定$final_rate - 对搜索爬虫,可额外加
limit_conn控制并发连接数,防连接耗尽
验证与调试要点
限速是否生效不能单看状态码,重点观察实际行为:
- 用
wget --no-check-certificate -v https://example.com/download/test.zip查看传输速率 - 在 log_format 中加入
$client_type $limit_rate $request_time $bytes_sent,分析日志确认分流与限速效果 - UA 为空或异常时(如部分 curl 请求),
$http_user_agent为 "",map 默认值会生效,务必设好default











