nginx 對同一 ip 訪問請求速率限制

模塊ngx_http_limit_req_module

主要用到的指令node

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個請求。code

若是不但願在請求受限的狀況下延遲過多的請求,nodelay則應使用如下參數:server

limit_req zone=one burst=5 nodelay;

delay參數(1.15.7)指定在該過分請求成爲被延遲請求的最大值。默認值爲零,即全部過多的請求都會延遲。繼承

能夠有多個limit_req指令。例如,如下配置將限制來自單個IP地址的請求的處理速率,同時限制虛擬服務器的請求處理速率: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級別記錄延遲。rem

句法: 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參數做爲Nginx Plus商業訂閱的一部分提供 。

相關文章
相關標籤/搜索