当前位置: > Linux服务器 > nginx >

Nginx使用HttpLimitReqModule模块限制访问频次

时间:2015-02-26 14:22来源:linux.it.net.cn 作者:IT
先贴一下官方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(比如搜索引擎)的访问
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;
} 


(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容