nginx 對同一 ip 訪問請求速率限制
模組ngx_http_limit_req_module
主要用到的指令
limit_req 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=name [burst=number] [nodelay | delay=number];
預設:-
語境: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_log_level info | notice | warn | error;
預設:
limit_req_log_level錯誤;
語境:http,server,location
該指令出現在0.8.18版本中。
為伺服器因速率超過或延遲請求處理而拒絕處理請求的情況設定所需的日誌記錄級別。延遲的記錄水平比拒絕的記錄水平低一個點; 例如,如果limit_req_log_level notice指定了“ ”,則會使用info級別記錄延遲。
句法:limit_req_status code;
預設:
limit_req_status 503;
語境:http,server,location
該指令出現在1.3.15版本中。
設定要響應拒絕的請求而返回的狀態程式碼。
句法:limit_req_zone key zone=name:size rate=rate [sync];
預設:-
語境:http
設定共享記憶體區域的引數,該區域將保留各種鍵的狀態。特別是,狀態儲存當前的過多請求數。該key可以包含文字,變數,他們的組合。具有空鍵值的請求不計算在內。
在1.7.6版之前,鍵值 key可以只包含一個變數。
用法示例:
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
這裡,狀態保持在10兆位元組區域“one”,並且該區域的平均請求處理速率不能超過每秒1個請求。
客戶端IP地址用作鍵值。需要注意的是,而不是$remote_addr,該 $binary_remote_addr變數在這裡使用。$binary_remote_addr對於IPv4地址,變數的大小始終為4個位元組,對於IPv6地址,變數的大小始終為16個位元組。儲存狀態在32位平臺上總是佔用64個位元組,在64位平臺上佔用128個位元組。一兆位元組區域可以保留大約16,000個64位元組狀態或大約8千個128位元組狀態。
如果區域儲存空間耗盡,則刪除最近最少使用的狀態。即使在此之後無法建立新狀態,該請求也會因錯誤而終止。
速率以每秒請求數(r/s)指定。如果需要每秒少於一個請求的速率,則在每分鐘請求(r/m)中指定。例如,每秒半請求為30r/m。
的sync引數(1.15.3)使 同步 共享儲存器區。
該sync引數作為我們商業訂閱的一部分提供 。