ngx_http_limit_req_module模块是默认安装的
limit_req_zone指令可进行限流访问,防止用户恶意攻击刷爆服务器
nginx.conf配置文件
在http模块下
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;
limit_req_zone $binary_remote_addr$uri zone=two:10m rate=1r/m;
在location
对于同一ip不同请求地址,限制平均速率为1请求/秒,超过部分进行延迟处理,若超过1请求/秒,丢弃超过部分
location /api/index/login {
proxy_pass http://127.0.0.1:8082/index/login;
limit_req zone=one burst=1 nodelay;
}
对于同一ip相同请求地址,限制平均速率为1请求/秒,超过部分进行延迟处理,若超过1请求/秒,丢弃超过部分
location / {
root /opt/webapp;
index index.html index.htm;
limit_req zone=two burst=1 nodelay;
}
指令详解
limit_req_zone
limit_req_zone key zone=name:size rate=rate;
- 只能在http块中使用
- key:若客户的请求匹配了key,则进入zone,可以是文本、变量,通常为Nginx变量。
如$binary_remote_addr
(客户的ip),$uri
(不带参数的请求地址),$request_uri
(带参数的请求地址),$server_name
(服务器名称)。 - zone:指定名字
- size:指定内存大小,1m可以保持16000个状态
- rate:限速,使用rate=1r/s,限制平均1秒不超过1个请求。使用rate=1r/m,限制平均1分钟不超过1个请求
# 同一ip不同请求地址,进入名为one的zone,限制速率为5请求/秒
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
# 同一ip同一请求地址,进入名为two的zone,限制速率为1请求/分钟
limit_req_zone $binary_remote_addr$uri zone=two:10m rate=1r/m;
limit_req
imit_req zone=name [burst=number] [nodelay];
- 可在http, server, location块中使用
- zone:被声明过的名字
- burst(可选):指定最大突发请求数,及缓存队列,延迟处理超过rate限制的请求
- 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服务暂时不可用)