使用limit_conn按User-Agent类型限连更精准,通过map归类UA为简短标识(如bot),再以该标识为键创建限连区,避免IP限连误伤;需配合limit_req、IP限连等策略,并注意UA可伪造。

直接用 limit_conn 限制特定 User-Agent 的连接,比单纯按 IP 限更精准——它能区分“人用 Chrome 访问”和“脚本伪装 Chrome 的爬虫”,避免误伤真实用户。
核心思路:用 map 提取 UA 特征,再绑定限连区域
不能直接对 $http_user_agent 做限连,因为字符串太长、内存开销大。必须先用 map 指令归类,生成简短标识符:
- 在
http块顶部定义映射规则,把常见爬虫 UA 映射为统一标记(如bot),合法 UA 映射为空或白名单标识 - 用该标记作为
limit_conn_zone的键,例如:limit_conn_zone $ua_type zone=ua_conn:10m; - 在
location中启用:limit_conn ua_conn 2;,表示每个匹配的 UA 类型最多维持 2 个活跃连接
配置示例(防 bot 类爬虫)
以下片段可直接放入 Nginx 主配置的 http 块中:
map $http_user_agent $ua_type {
default "";
~*curl "bot";
~*wget "bot";
~*python-urllib "bot";
~*scrapy "bot";
~*spider "bot";
~*bot "bot";
~*slurp "bot";
}
<p>limit_conn_zone $ua_type zone=ua_conn:10m;
limit_conn_status 429;</p>
然后在需要防护的 location(如 /api 或 /search)里加上:
limit_conn ua_conn 2;
这样,所有匹配到 bot 标记的请求,无论来自多少个不同 IP,总共只能维持最多 2 个并发连接——有效压制单个 UA 大量建连的行为。
关键注意事项
-
UA 可伪造,不能单独依赖:恶意爬虫可随意修改
User-Agent,所以此策略必须和limit_req(请求速率限制)、IP 级limit_conn配合使用 -
区分大小写与正则写法:map 中的
~*表示忽略大小写的正则匹配;若只写~则区分大小写,容易漏判 -
空值不计入限制:
default ""表示未匹配任何规则的 UA(如正常浏览器)映射为空字符串,而空字符串不会被limit_conn_zone统计,相当于放行 - 生效范围是活跃连接:只统计已读完请求头、尚未完成响应的连接,不包括快速断连或 SYN Flood
建议搭配的防护动作
- 返回标准 HTTP 状态码:
limit_conn_status 429;,便于前端或监控系统识别限流事件 - 记录详细日志:
limit_conn_log_level warn;,把触发限连的请求记为 warning 级别,方便排查 - 叠加请求速率控制:
limit_req zone=ua_req burst=3 nodelay;,防止“少量连接 + 高频请求”的绕过方式 - 必要时封禁 UA:
if ($http_user_agent ~* "(scrapy|curl)") { return 403; },但需谨慎,避免误伤调试工具











