模組 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 |
---|---|
預設值 | — |
內容 |
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 |
---|---|
預設值 |
limit_req_dry_run off; |
內容 |
http , server , location |
此指令出現在 1.17.1 版中。
啟用試執行模式。在此模式下,請求處理速率不受限制,但是,在共享記憶體區域中,過多的請求數量將照常計算。
語法 |
limit_req_log_level |
---|---|
預設值 |
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 |
---|---|
預設值 | — |
內容 |
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):
PASSED
、DELAYED
、REJECTED
、DELAYED_DRY_RUN
或REJECTED_DRY_RUN