如何限制百度等蜘蛛的抓取频率?使用nginx 限制百度蜘蛛抓取过快

如何限制百度等蜘蛛的抓取频率?使用nginx 限制百度蜘蛛抓取过快

最近连着两个月,有个小网站被百度服务器抓的压力山大,在百度站长平台调整了抓取频率只能管用一个月,现在一个月过去了,百度蜘蛛又自动变回了最大抓取,一天抓40万次的样子,网站服务器还是扛不住,这次还是没上cdn,只能靠服务器硬抗,为了缓解服务器压力,决定对着这不智能的蜘蛛限流,每分钟调整只让百度蜘蛛访问60次,再多了就返回503状态码,现学现用,把搜索到的文章内容做个整理备份,注明出处。

涉及到nginx的ngx_http_limit_req_module模块 进行条件限制,也涉及到需要返回的http状态的一些知识,记录一下,以免后面用的时候找不到。
通过此方式限制流量可以解决一部分搜索引擎疯狂抓取的问题,但是也会带来一些新的问题,比如上cdn时这些状态是不是会被cdn缓存而导致真实用户的访问请求被拒绝,甚至导致整个站点在cdn加速也无法访问,毕竟蜘蛛请求次数比正常用户请求次数多太多了,所以需要在上cdn的时候注意进行合理的测试,对于拒绝请求的不要cdn进行缓存,而只让cdn缓存正常请求返回的正确响应内容为主。
具体上cdn的情况需要后面测试才能知道。尽量能避开这个坑。
以下只转载的知识:

如何限制百度等蜘蛛的抓取频率
Q:发现有时候百度抓取非常频繁会导致服务器压力过大。如何限制他们的抓取频率

A:

nginx的ngx_http_limit_req_module模块限制了百度蜘蛛的抓取频率。每分钟允许百度蜘蛛抓取200次多余的抓取请求返回503。
nginx的配置

全局配置
limit_req_zone $anti_spider zone=anti_spider:60m rate=200r/m;

某个server中

limit_req zone=anti_spider burst=5 nodelay;
if ($http_user_agent ~* “baiduspider”) {
set $anti_spider $http_user_agent;
}

参数说明
指令limit_req_zone 中的rate=200r/m 表示每分钟只能处理200个请求。
指令limit_req 中的burst=5 表示最大并发为5。即同一时间只能同时处理5个请求。
指令limit_req 中的 nodelay 表示当已经达到burst值时再来新请求时直接返回503
IF部分用于判断是否是百度蜘蛛的user agent。如果是就对变量$anti_spider赋值。这样就做到了只对百度蜘蛛进行限制了。

转载于:https://blog.51cto.com/chenx1242/1793502

nginx服务器请求限制模块ngx_http_limit_req_module

nginx 可以使用ngx_http_limit_req对服务器资源请求进行限制这对使用ab等工具恶意压测服务器和cc(challenge Collapsar)会有一定的防范作用。
该模块使用漏斗算法Leaky Bucket该算法有两种处理方式Traffic Shaping和Traffic Policing

在桶满水之后常见的两种处理方式为
1.暂时拦截住上方水的向下流动等待桶中的一部分水漏走后再放行上方水。
2.溢出的上方水直接抛弃。

将水看作网络通信中数据包的抽象则方式1起到的效果称为Traffic Shaping方式2起到的效果称为Traffic Policing
由此可见Traffic Shaping的核心理念是”等待”Traffic Policing的核心理念是”丢弃”。它们是两种常见的流速控制方法

nginx中该模块的使用配置示例
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

server {
location /search/ {
limit_req zone=one burst=5 nodelay;
}
第一段配置
第一个参数$binary_remote_addr 表示通过remote_addr这个标识来做限制“binary_”的目的是缩写内存占用量是限制同一客户端ip地址
第二个参数zone=one:10m表示生成一个大小为10M名字为one的内存区域用来存储访问的频次信息
第三个参数rate=1r/s表示允许相同标识的客户端的访问频次这里限制的是每秒1次还可以有比如30r/m的

第二段配置
第一个参数zone=one 设置使用哪个配置区域来做限制与上面limit_req_zone 里的name对应
第二个参数burst=5重点说明一下这个配置burst爆发的意思这个配置的意思是设置一个大小为5的缓冲区当有大量请求爆发过来时超过了访问频次限制的请求可以先放到这个缓冲区内
第三个参数nodelay如果设置超过访问频次而且缓冲区也满了的时候就会直接返回503如果没有设置则所有请求会等待排队

下面这个配置可以限制特定UA比如搜索引擎的访问

limit_req_zone $anti_spider zone=one:10m rate=10r/s;
limit_req zone=one burst=100 nodelay;
if ($http_user_agent ~* “googlebot|bingbot|Feedfetcher-Google”) {
set $anti_spider $http_user_agent;
}

作者usual2970
链接https://www.jianshu.com/p/f9888812e89c
来源简书
著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。

http常见的状态码400,401,403状态码分别代表什么
2XX 成功

· 200 OK表示从客户端发来的请求在服务器端被正确处理

· 204 No content表示请求成功但响应报文不含实体的主体部分

· 206 Partial Content进行范围请求

3XX 重定向

· 301 moved permanently永久性重定向表示资源已被分配了新的 URL

· 302 found临时性重定向表示资源临时被分配了新的 URL

· 303 see other表示资源存在着另一个 URL应使用 GET 方法丁香获取资源

· 304 not modified表示服务器允许访问资源但因发生请求未满足条件的情况

· 307 temporary redirect临时重定向和302含义相同

4XX 客户端错误

· 400 bad request请求报文存在语法错误

· 401 unauthorized表示发送的请求需要有通过 HTTP 认证的认证信息

· 403 forbidden表示对请求资源的访问被服务器拒绝

· 404 not found表示在服务器上没有找到请求的资源

5XX 服务器错误

· 500 internal sever error表示服务器端在执行请求时发生了错误

· 503 service unavailable表明服务器暂时处于超负载或正在停机维护无法处理请求

————————————————
版权声明本文为CSDN博主「liouswll」的原创文章遵循 CC 4.0 BY-SA 版权协议转载请附上原文出处链接及本声明。
原文链接https://blog.csdn.net/liouswll/article/details/80698619

使用nginx限制百度蜘蛛的频繁抓取

百度蜘蛛抓取量骤增导致服务器负载很高。最终用nginx的ngx_http_limit_req_module模块限制了百度蜘蛛的抓取频率。每分钟允许百度蜘蛛抓取200次多余的抓取请求返回503。
nginx的配置
#全局配置
limit_req_zone $anti_spider zone=anti_spider:60m rate=200r/m;
#某个server中
limit_req zone=anti_spider burst=5 nodelay;
if ($http_user_agent ~* “baiduspider”) {
set $anti_spider $http_user_agent;
}

参数说明
指令limit_req_zone 中的rate=200r/m 表示每分钟只能处理200个请求。
指令limit_req 中的burst=5 表示最大并发为5。即同一时间只能同时处理5个请求。
指令limit_req 中的 nodelay 表示当已经达到burst值时再来新请求时直接返回503
IF部分用于判断是否是百度蜘蛛的user agent。如果是就对变量$anti_spider赋值。这样就做到了只对百度蜘蛛进行限制了。
详细的参数说明可以查看官方文档。
http://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req_zone

这个模块对请求的限制采用了漏桶算法。
漏桶算法详见 http://baike.baidu.com/view/2054741.htm
相关代码请查看nginx源码文件 src/http/modules/ngx_http_limit_req_module.c
代码的核心部分是ngx_http_limit_req_lookup 方法。

“如何限制百度等蜘蛛的抓取频率?使用nginx 限制百度蜘蛛抓取过快”的3个回复

  1. 这篇文章太奇怪了,因为在文章里有复制的代码,发布以后,自己写的导语居然没有了标点符号,一段一句。。

    读起来太不舒服了。

评论已关闭。