Nginx 速率限制,使用多个速率规则

Nginx 速率限制,使用多个速率规则

使用 nginx 速率限制,使用此规则作为示例:

limit_req_zone $request_limiting_zone_key zone=request_limiting_search:20m rate=30r/m;

这将设置每分钟 30 个请求。但是,如果我想堆叠第二条规则,那么逻辑就是“每分钟 30 个请求,或每秒 1 个请求。以先到者为准”

这样做的原因是,我们仍然希望将上限设为每分钟 30 次,但我们发现有些奇怪的尝试会在 1-2 秒内发送 10 次请求。当请求以如此快的速度通过时,这会导致一些问题。因此,我们希望将用户请求数量限制为每秒 1 个,并且每分钟的上限为 30 个。

我阅读了文档参考,但没有看到太多有关堆叠不同速率规则的内容。

这可能吗?如果可以,语法是什么?

答案1

将多个区域应用于同一个块是完全有效的。您还可以创建多个区域来存储对同一密钥的请求(通常客户端 IP 地址的一些前缀)它仅占用最少的处理和内存。

以下内容将以秒和分钟为间隔限制由其网络地址标识的用户,并允许他们短暂地超出定义的限制爆发您希望允许这样做,因为这将使您的网站对于使用不可靠输入设备和/或网络访问的用户来说看起来不那么糟糕 - 他们可能会发出两次相同的请求:

map $remote_addr $request_limiting_zone_key {
    # [..]
}
limit_req_zone $request_limiting_zone_key zone=request_limit_search_second:10m rate=1r/s;
limit_req_zone $request_limiting_zone_key zone=request_limit_search_minute:10m rate=30r/m;

 # [..]

location /search {
    limit_req zone=request_limit_search_second burst=3;
    limit_req zone=request_limit_search_minute burst=3;
}

话虽如此,如果您的网络服务器无法处理短时间的搜索请求,也许您需要将搜索引擎卸载到其他机器或应用不同类型的速率限制。您需要在典型的人类使用量和超出机器能力的使用量之间留出相当大的余地跟上。否则,您可能无法在惹恼合法用户和无法限制滥用/机器人使用之间找到一个安全值。

相关内容