ngx_http_limit_req_module 模块通过设定的key值来限制请求的处理速率,特别是来自单个IP地址的请求速率。使用漏桶算法进行限制。
大致思想就是:划分一个固定大小的内存区域,在nginx的preaccess阶段,以某一个key值将相应的请求存储到相应区域中,再根据设定的速率和挂起数量来限制请求。
配置示例
http { limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; server { location /search/ { limit_req zone=one burst=5; } }
语法:limit_req zone=name [burst=number] [nodelay];
默认值:空
可配置的位置:http,server,location
配置说明:zone=name为内存区域名字,burst=number为请求速率超过rate后允许挂起的请求数量,nodelay设置后多余的请求会立即返回503
语法::limit_req_zone key zone=name:size rate=rate;
默认值:空
可配置的位置:http
配置说明:key 为不同请求放入设定内存空间的标识,zone=name未设定内存区域的名字,size为空间大小(1m可以存储约16000个状态),rate=rate为设定的请求速率
配置测试
size | rate | burst | nodelay | 结果 |
10m | 1r/s | 0 | no | 每秒处理一个请求,多余请求返回503 |
10m | 1r/s | 5 | no | 每秒处理一个请求,其它请求全部挂起 |
10m | 1r/s | 1 | no | 每秒处理一个请求,其它请求全部挂起 |
10m | 1r/s | 1 | yes | 每秒处理两个请求,其它请求返回503 |
部分key 可以设置的值
key
|
含义
|
---|---|
$binary_remote_addr | 以压缩形式存储ip |
$http_user_agent | |
$server_name |