尝试限制 Nginx 中每个 URI 的请求

尝试限制 Nginx 中每个 URI 的请求

我发现我需要限制特定 IP 针对特定 URI(例如)发送的请求数,www.foo.com/somewhere/special同时不对网站的其余部分进行管制。

我该如何使用HttpLimitReqModule内置的 Nginx 进行配置?

答案1

以下是在我的某个网站上执行的操作。首先,我们使用geo模块定义一个用于识别有限地址的变量:

geo $slow {
    default 0;
    include /etc/nginx/conf.d/slowlist;
}

slowlist文件是这样的:

192.168.0.0/24  1;
192.168.10.0/24  1;

等等(当然,IP 地址只是示例)。然后我们定义速度限制:

limit_req_zone $binary_remote_addr zone=fast:1m rate=1000r/s;
limit_req_zone $binary_remote_addr zone=slow:10m rate=20r/m;

现在我们必须为每个 IP 地址分配 req_zones。在必要的位置内,我们检查变量 $slow,如果等于 1,则重定向到位置 @slow(使用虚构的错误 555):

recursive_error_pages on;
error_page 555 = @slow;
if ($slow = 1) {
    return 555;
}
limit_req zone=fast burst=10000 nodelay;

然后遵循常规规则,包括 root、index、fastcgi* 等等。这里将使用限制区域 'fast'。最后,我们定义位置 @slow,其中将使用限制区域 'slow':

location @slow {
    limit_req zone=slow burst=5 nodelay;

然后遵循正常规则,包括 root、index、fastcgi* 等等。

因此,通常的请求会在正常位置进行处理,但所有其他请求都会重定向到位置@slow。

答案2

您需要添加一个

location /somewhere/special {
...
}

你可以在其中配置你的限制HttpLimitReq模块或者HttpLimitZone模块模块。

相关内容