在我们的 Nginx 配置中,我们目前有以下内容:-
limit_req_zone $binary_remote_addr zone=two:10m rate=15r/m;
limit_req zone=two burst=5 nodelay;
现在我们想要改变这种情况,以便此速率限制适用于某些 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;
因此,来自 IP 111.222.333.444 的流量将受到第一个限制较严格的速率限制的影响,而不会受到第二个限制较少的速率限制的影响。
我们还使用 cloudflare,并在 /etc/nginx/cloudflare.conf 中设置了 cloudflare 的 ip 地址,类似于此https://support.cloudflare.com/hc/en-us/articles/200170706-如何恢复原始访客 IP-使用 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;
答案1
尽管这个问题很老了,但它可能会与将来偶然发现这个问题的人有关:
您可以使用多个 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;
}
当且仅当当前级别没有 limit_req 指令时,这些指令才会从上一级别继承。
http://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req
答案2
在这个问题上花了很长时间之后,我在配置中遇到了这个问题,
这是正确的,你唯一的问题是你正在检查每个速率限制中的 $addr_to_limit 变量而不是映射变量($limited_net 或 $less_limited_net)
加上一些细节
正确的配置应该是:
geo $limited_net {
default 0;
111.222.333.444 1;
}
map $addr_to_limit1 $limited_net {
0 "";
1 $binary_remote_addr;
}
limit_req_zone $limited_net zone=addr_to_limit1:10m rate=15r/m;
geo $less_limited_net {
default 1;
111.222.333.444 0;
}
map $addr_to_limit2 $less_limited_net {
0 "";
1 $binary_remote_addr;
}
limit_req_zone $less_limited_net zone=addr_to_limit2:10m rate=25r/m;