可直接用map指令为不同user-agent动态设置keepalive策略:先通过map将ua分类为bot、legacy、mobile等类型,再映射为对应keepalive_requests值(如bot设2、legacy设8),最后在server或upstream中引用$ka_requests生效。

直接用 map 指令为不同 User-Agent 动态设置 keepalive 策略,核心是把 UA 特征映射成变量,再通过 keepalive_requests 或 keepalive_timeout 的条件赋值实现差异化控制。Nginx 本身不支持在 location 中动态改写 keepalive 参数,但可以在 upstream 或 server 级别结合 map 变量做策略分流或降级。
识别并分类常见 User-Agent 类型
在 http 块中定义 map,提取 UA 的语义类别,比如爬虫、老旧浏览器、移动端、API 客户端等:
- 匹配主流爬虫(如 Baiduspider、Googlebot、YandexBot)设为
bot - 识别 IE/Trident 内核设为
legacy,这类客户端 keepalive 支持不稳定 - 区分移动端 UA(含 Mobile、Android、iPhone 等关键词)设为
mobile - 对空 UA、明显伪造 UA(如
python-urllib、curl/7.*/)统一标为untrusted
为不同类别设置 keepalive_requests 限值
keepalive_requests 控制单个长连接最多处理多少请求,对高频低质量连接特别有效:
- 爬虫和 untrusted 类型:设为
1~3,强制频繁重建连接,抑制扫描行为 - legacy 类型:设为
5~10,避免因旧协议 bug 导致连接卡死 - 正常浏览器(default):保持默认值(如
100),兼顾复用与稳定性 - 注意:该参数需配合
keepalive_timeout使用,不能单独生效
配合日志与 upstream 实现更精细控制
单纯靠 map + keepalive_requests 是基础层防护,进阶做法包括:
- 在 access_log 中记录
$ua_type和$connection_requests,便于识别异常连接模式(例如单连接发起 200+ 请求) - 对
bot和untrusted类型,在 upstream 中指向专用后端或限流池,隔离影响 - 用
if ($ua_type = "bot") { set $disable_keepalive 1; }配合自定义 header 透传,供后端做二次判断 - 不建议在 server 块里用 if 修改 keepalive 参数——Nginx 不允许运行时覆盖该指令
实际配置片段示例
以下为可直接部署的 http 块内配置:
map $http_user_agent $ua_type {
default normal;
~*[Bb]aiduspider bot;
~*[Gg]ooglebot bot;
~*[Yy]andexBot bot;
~*[Mm]snbot bot;
~*[Mm]sie legacy;
~*[Tt]rident legacy;
~*[Mm]obi mobile;
~*[Aa]ndroid mobile;
~*[Ii]phone mobile;
~*python-urllib untrusted;
~*curl/ untrusted;
~*^$ untrusted;
}
map $ua_type $ka_requests {
default 100;
bot 2;
legacy 8;
untrusted 1;
mobile 50;
}
然后在 server 或 upstream 中引用:keepalive_requests $ka_requests;(需 Nginx ≥ 1.15.3)










