首页 » 编程笔记 » Apache/Nginx » 正文

Nginx使用HttpLimitReqModule模块限制特定页面的爬虫频率

最近在做SEO的时候发现线上的详情页被百度爬虫抓取的频率很高,想到了应用Nginx使用HttpLimitReqModule模块来做限制,但是又不能一刀切,目前只是想把详情页的爬虫限制下频率,首先介绍下这个模块的使用手册:

官方wiki介绍:http://wiki.nginx.org/HttpLimitReqModule

此模块能通过特定的客户端标识(如IP,UA等)来限制客户端在一定时间内的访问频次;
简单介绍一下用法及配置说明模块通过两个指令来实现限制功能:

limit_req_zone 和limit_req

首先来看一下limit_req_zone的配置:

limit_req_zone

Syntax: limit_req_zone $variable 

zone

 = name : size 

rate

 = rate

Default:
Context: http

该指令必须放置在http的范围内配置;

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

这个指令只是做配置使用,具体执行的时候需要介绍到另一个指令limit_req
先来看一下limit_req的配置

limit_req

Syntax: limit_req 

zone

 = name [ 

burst

 = number ] [ 

nodelay

 ]

Default:
Context: http
server
location

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

下面这个配置是我在限制特定页面百度UA的抓取频率的配置:

http段:

limit_req_zone      $anti_spider    zone=anti_spider:60m    rate=3r/s;

sever段:

limit_req zone=anti_spider burst=5 nodelay;

set $anti_spider “”;

set $fg “”;
if ( $request_uri ~ “/detail/(.*)\.html” ) {
set $fg “n”;
}
if ($http_user_agent ~ “Baiduspider”) {
set $fg “${fg}a”;
}

if ( $fg = na ) {
set $anti_spider $http_user_agent;
}