如何在Nginx中通过请求参数限制请求次数?

我需要限制包含特定参数的(GET,POST)请求的请求次数,这些参数可以包含在请求的body或query parameter中。如何在nginx中配置?

当前的nginx配置:

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
server {
    listen       8044;
    limit_req_log_level warn;
    location /route/{
       limit_req zone=mylimit burst=1000;
       proxy_pass https://the_Cool_server/;
 }}

例如,请求如下:

http://localhost:8044/route/path1/path2?param1=param1VALUE_to_limit1&param2VALUEAWESOME

我需要nginx每秒限制带有param1值的请求。所以,每个带有相同param1的请求应该每秒限制为10个。

也许我应该使用openresty来实现它?

点赞
用户12807691
用户12807691

limit_req参数可以在httpserverlocation块中,因此您传统上只能通过路径来限制请求,例如:

http://localhost:8044/route/path1/path2

但是,有一种方法可以将访问者IP映射到变量,只有在他触发您的查询字符串键(param1)时才使用该变量($do_limit)在limit_req指令中,例如:

map $arg_ctl    $do_limit {
    "param1"    $binary_remote_addr;
    default     "";
}
limit_req_zone $do_limit zone=mylimit:10m rate=10r/s;
server {
    listen       8044;
    limit_req_log_level warn;
    location /route/{
       limit_req zone=mylimit burst=1000;
       proxy_pass https://the_Cool_server/;
 }}
2021-05-10 10:57:24