Networking

Nginx速率限制,使用多個速率規則

  • July 25, 2019

使用nginx限速,以這條規則為例:

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

這將設置每分鐘 30 個請求。但是,如果我想堆疊第二條規則怎麼辦,所以邏輯是“每分鐘 30 個請求,或每秒 1 個請求。以先到者為準”

這樣做的原因是我們仍然想要 30/min 的上限,但是有一些奇怪的嘗試,我們會在 1-2 秒的時間內看到 10x 請求的垃圾郵件。當請求通過這麼快時,這會導致一些問題。因此,我們希望將使用者限制為每秒 1 個請求,並且上限為每分鐘 30 個。

我閱讀了文件參考,但在堆疊不同的費率規則方面沒有看到太多。

這可能嗎?如果是這樣,語法是什麼?

**將多個區域應用於同一塊是完全有效的。**您還可以創建多個區域來儲存對相同密鑰的請求(通常是客戶端 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;
}

話雖如此,如果您的網路伺服器無法處理短暫的搜尋請求,那麼您可能需要將搜尋引擎解除安裝到其他機器或應用不同類型的速率限制。您需要在典型的人類使用和超出您的機器跟上能力的使用之間留出很大的餘量。否則,您可能無法在惱人的合法使用者和未能限制濫用/機器人使用之間找到一個安全的值。

引用自:https://serverfault.com/questions/976574