模組 ngx_http_limit_req_module

範例設定
指令
     limit_req
     limit_req_dry_run
     limit_req_log_level
     limit_req_status
     limit_req_zone
內嵌變數

ngx_http_limit_req_module 模組 (0.7.21) 用於限制每個已定義金鑰的請求處理速率,特別是來自單一 IP 位址的請求處理速率。限制是使用「漏桶」方法完成的。

範例設定

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

    ...

    server {

        ...

        location /search/ {
            limit_req zone=one burst=5;
        }

指令

語法 limit_req zone=名稱 [burst=數字] [nodelay | delay=數字];
預設值
內容 http, server, location

設定共享記憶體區域和請求的最大突發大小。如果請求速率超過為區域設定的速率,則其處理將延遲,以便以定義的速率處理請求。過多的請求將延遲,直到其數量超過最大突發大小,在這種情況下,請求將以錯誤終止。預設情況下,最大突發大小等於零。例如,以下指令

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

server {
    location /search/ {
        limit_req zone=one burst=5;
    }

允許平均每秒不超過 1 個請求,突發請求不超過 5 個。

如果在限制請求時不希望延遲過多的請求,則應使用參數 nodelay

limit_req zone=one burst=5 nodelay;

delay 參數 (1.15.7) 指定過多的請求開始延遲的限制。預設值為零,即所有過多的請求都將延遲。

可以有多個 limit_req 指令。例如,以下設定將限制來自單一 IP 位址的請求處理速率,同時限制虛擬伺服器的請求處理速率

limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
limit_req_zone $server_name zone=perserver:10m rate=10r/s;

server {
    ...
    limit_req zone=perip burst=5 nodelay;
    limit_req zone=perserver burst=10;
}

這些指令是從先前的設定層級繼承而來,前提是目前層級上沒有定義 limit_req 指令。

語法 limit_req_dry_run on | off;
預設值
limit_req_dry_run off;
內容 http, server, location

此指令出現在 1.17.1 版中。

啟用試執行模式。在此模式下,請求處理速率不受限制,但是,在共享記憶體區域中,過多的請求數量將照常計算。

語法 limit_req_log_level info | notice | warn | error;
預設值
limit_req_log_level error;
內容 http, server, location

此指令出現在 0.8.18 版中。

設定伺服器由於速率超出而拒絕處理請求或延遲請求處理時所需的記錄層級。延遲的記錄層級比拒絕的記錄層級低一個點;例如,如果指定「limit_req_log_level notice」,則延遲將以 info 層級記錄。

語法 limit_req_status 代碼;
預設值
limit_req_status 503;
內容 http, server, location

此指令出現在 1.3.15 版中。

設定回應遭拒絕請求時要傳回的狀態碼。

語法 limit_req_zone 金鑰 zone=名稱:大小 rate=速率 [sync];
預設值
內容 http

設定共享記憶體區域的參數,該區域將保留各種金鑰的狀態。特別是,該狀態會儲存過多請求的目前數量。金鑰可以包含文字、變數及其組合。具有空金鑰值的請求不會被計算在內。

在 1.7.6 版之前,金鑰只能包含一個變數。

使用範例

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

在這裡,狀態保存在一個 10 MB 的「one」區域中,並且此區域的平均請求處理速率不能超過每秒 1 個請求。

客戶端 IP 位址充當金鑰。請注意,這裡使用 $binary_remote_addr 變數,而不是 $remote_addr。對於 IPv4 位址,$binary_remote_addr 變數的大小始終為 4 個位元組,對於 IPv6 位址則為 16 個位元組。儲存的狀態在 32 位元平台上始終佔用 64 個位元組,在 64 位元平台上則佔用 128 個位元組。一個 MB 的區域可以保存大約 16,000 個 64 位元組狀態或大約 8,000 個 128 位元組狀態。

如果區域儲存空間耗盡,則會移除最近最少使用的狀態。即使在之後仍然無法建立新狀態,請求也會以錯誤終止。

速率以每秒請求數 (r/s) 指定。如果需要的速率低於每秒 1 個請求,則以每分鐘請求數 (r/m) 指定。例如,每秒半個請求是 30r/m。

sync 參數 (1.15.3) 啟用共享記憶體區域的同步

sync 參數可作為我們商業訂閱的一部分使用。

此外,作為我們商業訂閱的一部分,自 1.17.7 起,可以使用API 取得重置每個此類共享記憶體區域的狀態資訊

內嵌變數

$limit_req_status
保留限制請求處理速率的結果 (1.17.6):PASSEDDELAYEDREJECTEDDELAYED_DRY_RUNREJECTED_DRY_RUN