
对于没有防火前或者使用了某些基础版防火墙的小伙伴而言,限制AI爬虫、搜索引擎、普通用户的访问频次,简直非常恼火,这不,我以使用nginx服务作为例子来给大家分享一下。
一、打开宝塔面板,找到“软件商店”,继续找nginx,点“设置”
当然也可以直接打开/www/server/nginx/conf/nginx.conf 进行编辑
二、撰写配置文件
(一)在http部分,输入以下内容
我这里只是列出了部分AI爬虫、部分搜索引擎,可以根据自己的需要添加
# 1定义 Map:区分“恶意/AI爬虫”和“普通爬虫/用户”
map $http_user_agent $is_ai_bot {
default "";
"~*GPTBot" $binary_remote_addr;
"~*OAI-SearchBot" $binary_remote_addr;
"~*Amazonbot" $binary_remote_addr;
}
# 2. 定义 Map:区分“正规搜索引擎”
map $http_user_agent $is_seo_bot {
default "";
"~*Googlebot" $binary_remote_addr;
"~*Baiduspider" $binary_remote_addr;
}
# 3. 定义限流区
# 【最严格】针对 AI 爬虫:1秒1次,不允许突发
limit_req_zone $is_ai_bot zone=gpt_limit:10m rate=1r/s;
# 【中等】针对 SEO 爬虫:5秒10次 (即 0.5s 1次),允许一定突发
limit_req_zone $is_seo_bot zone=seo_limit:10m rate=10r/s;
# 【宽松】针对所有 IP (防CC攻击/暴力破解):1秒10次
limit_req_zone $binary_remote_addr zone=general_limit:10m rate=10r/s;

(二)在server部分,输入以下内容
location / {
# 1. 针对 AI 爬虫限流
# 直接写在这里,不要包在 if 里
# 如果 $is_ai_bot 为空,这条规则会自动跳过该请求
limit_req zone=gpt_limit burst=5 nodelay;
# 2. 针对 SEO 爬虫限流
limit_req zone=seo_limit burst=20 nodelay;
# 3. 全局兜底限流
limit_req zone=general_limit burst=50 nodelay;
}

(三)保存,然后重启nginx生效
三、注意事项
假设你的基础限流配置是:rate=10r/s(每秒允许10个请求,即每100毫秒1个请求),并且配置了 limit_req zone=gpt_limit burst=5 nodelay。
场景:客户端在 0 毫秒内,瞬间连续发来了 7 个请求。
- 第 1 个请求:正常处理。
- 第 2 到第 6 个请求(共5个):触发了
burst=5,因为加了nodelay,这5个请求不排队,立刻被处理并返回结果。 - 第 7 个请求:因为 burst 桶的容量只有 5,已经满了,这个请求会被直接拒绝(返回 503 或自定义错误码)。
后续:
在这个突发流量过后,burst 桶会以 10r/s 的速率慢慢恢复(每 100ms 恢复 1 个名额),以便应对下一次突发流量。
注意:配置不要过分限制