对某些 IP 地址应用 nginx 速率限制,对其他 IP 地址应用另一个速率限制

use*_*762 6 nginx

在我们的 Nginx 配置中,我们目前有这个:-

limit_req_zone $binary_remote_addr zone=two:10m rate=15r/m;
limit_req zone=two burst=5 nodelay;
Run Code Online (Sandbox Code Playgroud)

现在我们要更改此设置,以便此速率限制适用于某些 IP 地址,然后设置另一个适用于其他 IP 地址的速率限制,但限制性稍低。

geo $limited_net {
    default      0;
    111.222.333.444  1;
}

map $limited_net $addr_to_limit {
    0  "";
    1  $binary_remote_addr;  
}

limit_req_zone  $addr_to_limit  zone=two:10m  rate=15r/m;


geo $less_limited_net {
    default      1;
    111.222.333.444  0;
}

map $less_limited_net $addr_to_limit {
    0  "";
    1  $binary_remote_addr;
}

limit_req_zone  $addr_to_limit  zone=three:10m  rate=25r/m;
Run Code Online (Sandbox Code Playgroud)

因此,来自 IP 111.222.333.444 的流量将受到第一个限制性更强的速率限制的影响,而不是第二个限制性较低的限制。

我们也使用 cloudflare 并在 /etc/nginx/cloudflare.conf 中设置了与此类似的 cloudflare ip 地址https://support.cloudflare.com/hc/en-us/articles/200170706-How-do-I- restore-original-visitor-IP-with-Nginx-

这会给我我想要的吗?

还是应该更像这样?

geo $limited_net { 
default 0; 
111.222.333.444 1; 
} 

map $limited_net $addr_to_limit { 
0 ""; 
1 $binary_remote_addr; 
} 


limit_req_zone $addr_to_limit zone=two:10m rate=15r/m; 
limit_req_zone $binary_remote_addr; zone=three:10m rate=25r/m;
Run Code Online (Sandbox Code Playgroud)

小智 4

尽管这个问题很老了,但它可能与将来遇到这个问题的人相关:

您可以使用多个 limit_req_zone 指令以不同的速率处理来自不同来源的请求:

可能有多个 limit_req 指令。例如,以下配置将限制来自单个IP地址的请求的处理速率,同时限制虚拟服务器的请求处理速率:

 limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
 limit_req_zone $server_name zone=perserver:10m rate=10r/s;

 server {
     ...
     limit_req zone=perip burst=5 nodelay;
     limit_req zone=perserver burst=10;
 }
Run Code Online (Sandbox Code Playgroud)

当且仅当当前级别上没有 limit_req 指令时,这些指令才会从上一级继承。

http://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req