
使用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;
}
話雖這麼說,如果您的網頁伺服器無法處理短時間的搜尋要求,也許您需要將搜尋引擎卸載到其他電腦或應用不同類型的速率限制。您需要在典型的人類使用情況和超出機器能力的使用情況之間留出很大的餘裕跟上。否則,您可能無法在煩人的合法用戶和無法限制濫用/機器人的使用之間找到安全的價值。