Nginx

嘗試限制每個 URI 中的 Nginx 請求

  • December 18, 2011

我發現自己需要限制特定 IP 可以針對特定 URI(例如www.foo.com/somewhere/special)發送的請求數量,同時讓站點的其餘部分不受監管。

我將如何使用HttpLimitReqModule內置的 Nginx 配置它?

這是在我的一個網站上完成的方法。首先,我們使用geo模組定義一個變數,用於辨識有限地址:

geo $slow {
   default 0;
   include /etc/nginx/conf.d/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;

現在我們必須將 req_zones 分配給每個 IP 地址。在必要的位置,我們檢查變數 $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* 等等。此處將使用“快速”限制區域。最後,我們定義位置@slow,其中將使用限制區域’slow’:

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

然後是正正常則,包括 root、index、fastcgi* 等等。

因此,通常的請求在正常位置處理,但所有其他請求都被重定向到@slow 位置。

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