在我们的 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