我发现我需要限制特定 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。