Nginx http_limit_req模块详解
简介
在配置nginx的过程中我们需要考虑受到攻击或恶意请求的情况,比如单用户恶意发起大量请求,这时http_limit_req
模块可以帮助我们对其进行限制。
ngx_http_limit_req_module模块用于限制请求的处理速率,特别是单一的IP地址的请求的处理速率。它基于漏桶算法进行限制。
官方英文文档: http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
配置示例
http { limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s; limit_req_zone $binary_remote_addr$uri zone=two:10m rate=1r/s; ... server { ... location /search/ { limit_req zone=one burst=10 nodelay; limit_req zone=two burst=5 nodelay; } ... }
此配置代表:对于同一ip不同请求地址,限制平均速率为5请求/秒,超过部分进行延迟处理,若超过10请求/秒,丢弃超过部分。
对于同一ip相同请求地址,限制平均速率为1请求/秒,超过部分进行延迟处理,若超过5请求/秒,丢弃超过部分。
基本指令
limit_req_zone
语法: limit_req_zone key zone=name:size rate=rate;
只能在http
块中使用
此指令用于声明请求限制zone,zone可以保存各种key的状态,name是zone的唯一标识,size代表zone的内存大小,rate指定速率限制。
参数详解:
1.key
若客户的请求匹配了key
,则进入zone。可以是文本、变量,通常为Nginx变量。
如$binary_remote_addr(客户的ip),$uri(不带参数的请求地址),$request_uri(带参数的请求地址),$server_name(服务器名称)。
支持拼接组合使用,如$binary_remote_addr$uri。
2.zone
使用zone=test
,指定此zone的名字为test。
3.size
在zone=name后面紧跟:size,指定此zone的内存大小。如zone=name:10m
,代表name的共享内存大小为10m。通常情况下,1m可以保存16000个状态。
4.rate
使用rate=1r/s,限制平均1秒不超过1个请求。使用rate=1r/m,限制平均1分钟不超过1个请求。
例子
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s; limit_req_zone $binary_remote_addr$uri zone=two:10m rate=1r/s;
同一ip不同请求地址,进入名为one的zone,限制速率为5请求/秒。
同一ip同一请求地址,进入名为two的zone,限制速率为1请求/秒。
limit_req
语法: limit_req zone=name [burst=number] [nodelay];
可在http, server, location
块中使用
此指令用于设置共享的内存zone和最大的突发请求大小。
若请求速率超过了limit_req_zone中指定的rate
但小于limit_req中的burst
,则进行延迟处理,若再超过burst,就可以通过设置nodelay
对其进行丢弃处理。
参数详解:
1.zone
使用zone=name
指定使用名为name的zone,这个zone之前使用limit_req_zone声明过。
2.burst(可选)
burst
用于指定最大突发请求数。许多场景下,单一地限制rate并不能满足需求,设置burst,可以延迟处理超过rate限制的请求。
3.nodelay(可选)
如果设置了nodelay
,在突发请求数大于burst
时,会丢弃掉这部分请求。因为如果只是延迟处理,就像”漏斗“,一旦上面加得快(请求),下面漏的慢(处理速度),”漏斗”总会有溢出的时候。这时,丢弃掉溢出的部分就显得很有意义了。
例子,
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; server { location /search/ { limit_req zone=one burst=5; } }
单客户分为三种情况
- 请求速率 < rate(1r/s),正常处理
- rate(1r/s) < 请求速率 < burst(5r/s),大于rate部分延迟
- burst(5r/s) < 请求速率,大于burst部分丢弃(返回503服务暂时不可用)
limit_req_status
语法: limit_req_status 503;
可在http, server, location
块中使用
设置要响应拒绝的请求而返回的状态代码(默认为503服务不可用)。
limit_req_log_level
语法: limit_req_log_level info | notice | warn | error;
可在http, server, location
块中使用
设置当速率超过限制时记录日志的级别。