ingress-nginx 针对源 IP 限速 示例了 ingress-nginx 的基于源 IP 限速的方法,这里解读一下配置文件。
location 中增加的配置:
location /fastjson {
... 省略 ....
limit_req zone=test-fastjson_rpm burst=25 nodelay;
... 省略 ....
}
zone 指向的是统计请求次数的共享内存,设置如下:
limit_req_zone $limit_dGVzdC1qaW5nYW5naHVpZ3VpeWlfZmFzdGpzb24 zone=test-fastjson_rpm:5m rate=5r/m;
内存大小是 5 兆,限速频率为每分钟 5 次。重点是作为 key 的变量 $limit_XXX 的值。 $limit_XXX 变量是共享内存中的次数统计的 key,用 map 指令定义,它的值取决于 $whitelist_XXX,如果 $whitelist_XXX 为 0,$limitXXX 的值是 $binary_remote_addr,即源 IP,否则为空。
map $whitelist_dGVzdC1qaW5nYW5naHVpZ3VpeWlfZmFzdGpzb24 $limit_dGVzdC1qaW5nYW5naHVpZ3VpeWlfZmFzdGpzb24 {
0 $binary_remote_addr;
1 "";
}
用白名单用 geo 变通实现,$the_real_ip 与名单中的 1.1.0.0/16 匹配时,$whitelist_XXX 是 1:
geo $the_real_ip $whitelist_dGVzdC1qaW5nYW5naHVpZ3VpeWlfZmFzdGpzb24 {
default 0;
1.1.0.0/16 1;
}
$the_real_ip 是 $remote_addr:
map '' $the_real_ip {
default $remote_addr;
}
ingress-nginx 的限速功能只支持白名单,可以对部分 IP 不限速,但不支持黑名单,有时候希望只对特定的 IP 限速。
另外默认都是 nodelay 方式,好像不支持自定义:
location /fastjson {
... 省略 ....
limit_req zone=test-fastjson_rpm burst=25 nodelay;
... 省略 ....
}