天天看點

【Nginx】第八節 請求限制

author:咔咔

這裡我就複制一份别人寫的不錯的總結,我就簡單說一下$binary_remote_addr這個參數,這個參數跟remoto_addr都是用戶端ip的參數,但是$binary_remote_addr這個在存儲的時候會比remote_addr少10來個位元組,就這一個注意點

使用場景:

 我們經常會遇到這種情況,伺服器流量異常,負載過大等等。對于大流量惡意的攻擊通路,會帶來帶寬的浪費,伺服器壓力,影響業務,往往考慮對同一個ip的連接配接數,并發數進行限制。http_limit_conn_module 子產品來實作。該子產品可以根據定義的鍵來限制每個鍵值的連接配接數,如同一個ip來源的連接配接數。并不是所有的連接配接都會被該子產品計數,隻有那些正在被處理的請求(這些請求的頭資訊已被完全讀入)所在的連接配接才會被計數。http_limit_req_module 子產品來實作,該子產品可以通過定義的 鍵值來限制請求處理的頻率。特别的,可以限制來自單個ip位址的請求處理頻率。 限制的方法如同漏鬥,每秒固定處理請求數,推遲過多請求。

二,配置文法

1,http_limit_conn_module指令解釋

limit_conn_zone

文法: limit_conn_zone $variable zone=name:size;

預設值: none

配置段: http

    該指令描述會話狀态存儲區域。鍵的狀态中儲存了目前連接配接數,鍵的值可以是特定變量的任何非空值(空值将不會被考慮)。$variable定義鍵,zone=name定義區域名稱,後面的limit_conn指令會用到的。size定義各個鍵共享記憶體空間大小。如:

limit_conn_zone $binary_remote_addr zone=addr:10m;

注釋:用戶端的ip位址作為鍵。注意,這裡使用的是$binary_remote_addr變量,而不是$remote_addr變量。

$remote_addr變量的長度為7位元組到15位元組,而存儲狀态在32位平台中占用32位元組或64位元組,在64位平台中占用64位元組。

$binary_remote_addr變量的長度是固定的4位元組,存儲狀态在32位平台中占用32位元組或64位元組,在64位平台中占用64位元組。

1m共享空間可以儲存3.2萬個32位的狀态,1.6萬個64位的狀态。

如果共享記憶體空間被耗盡,伺服器将會對後續所有的請求傳回 503 (service temporarily unavailable) 錯誤。

limit_zone 指令和limit_conn_zone指令同等意思,已經被棄用,就不再做說明了。

limit_conn_log_level

文法:limit_conn_log_level info | notice | warn | error

預設值:error

配置段:http, server, location

當達到最大限制連接配接數後,記錄日志的等級。

limit_conn

文法:limit_conn zone_name number

預設值:none

指定每個給定鍵值的最大同時連接配接數,當超過這個數字時被傳回503 (service temporarily unavailable)錯誤。如:

limit_conn_zone $binary_remote_addrzone=addr:10m;

server{

    location /www.baidu.com/{

        limit_conn addr 1;

    }

}

    同一ip同一時間隻允許有一個連接配接。

當多個 limit_conn 指令被配置時,所有的連接配接數限制都會生效。比如,下面配置不僅會限制單一ip來源的連接配接數,同時也會限制單一虛拟伺服器的總連接配接數:

limit_conn_zone $binary_remote_addr zone=perip:10m;

limit_conn_zone $server_name zone=perserver:10m;

server {

    limit_conn perip 10;

    limit_conn perserver 100;

[warning]limit_conn指令可以從上級繼承下來。[/warning]

limit_conn_status

文法: limit_conn_status code;

預設值: limit_conn_status 503;

配置段: http, server, location

該指定在1.3.15版本引入的。指定當超過限制時,傳回的狀态碼。預設是503。

limit_rate

文法:limit_rate rate

預設值:0

配置段:http, server, location, if in location

    對每個連接配接的速率限制。參數rate的機關是位元組/秒,設定為0将關閉限速。 按連接配接限速而不是按ip限制,是以如果某個用戶端同時開啟了兩個連接配接,那麼用戶端的整體速率是這條指令設定值的2倍。

完整執行個體配置

http{

    limit_conn_zone$binary_remote_addrzone=limit:10m;

    limit_conn_log_level info;

    server{

        location  ^~/download/{  

        limit_conn limit 4;

        limit_rate 200k;

        /data/www.baidu.com/download/;

        }

使用注意事項

    事務都具有兩面性的。http_limit_conn_module 子產品雖說可以解決目前面臨的并發問題,但是會引入另外一些問題的。如前端如果有做lvs或反代,而我們後端啟用了該子產品功能,那不是非常多503錯誤了?這樣的話,可以在前端啟用該子產品,要麼就是設定白名單,白名單設定參見後續的文檔。

2,ngx_http_limit_req_module子產品指令

limit_req_zone

文法: limit_req_zone $variable zone=name:size rate=rate;

    設定一塊共享記憶體限制域用來儲存鍵值的狀态參數。 特别是儲存了目前超出請求的數量。 鍵的值就是指定的變量(空值不會被計算)。如

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

說明:區域名稱為one,大小為10m,平均處理的請求頻率不能超過每秒一次。

鍵值是用戶端ip。

    使用$binary_remote_addr變量, 可以将每條狀态記錄的大小減少到64個位元組,這樣1m的記憶體可以儲存大約1萬6千個64位元組的記錄。

    如果限制域的存儲空間耗盡了,對于後續所有請求,伺服器都會傳回 503 (service temporarily unavailable)錯誤。

速度可以設定為每秒處理請求數和每分鐘處理請求數,其值必須是整數,是以如果你需要指定每秒處理少于1個的請求,2秒處理一個請求,可以使用 “30r/m”。

limit_req_log_level

文法: limit_req_log_level info | notice | warn | error;

預設值: limit_req_log_level error;

    設定你所希望的日志級别,當伺服器因為頻率過高拒絕或者延遲處理請求時可以記下相應級别的日志。 延遲記錄的日志級别比拒絕的低一個級别;比如, 如果設定“limit_req_log_level notice”, 延遲的日志就是info級别。

limit_req_status

文法: limit_req_status code;

預設值: limit_req_status 503;

該指令在1.3.15版本引入。設定拒絕請求的響應狀态碼。

limit_req

文法: limit_req zone=name [burst=number] [nodelay];

預設值: —

    設定對應的共享記憶體限制域和允許被處理的最大請求數門檻值。 如果請求的頻率超過了限制域配置的值,請求處理會被延遲,是以所有的請求都是以定義的頻率被處理的。 超過頻率限制的請求會被延遲,直到被延遲的請求數超過了定義的門檻值,這時,這個請求會被終止,并傳回503 (service temporarily unavailable) 錯誤。這個門檻值的預設值為0。如:

limit_req_zone $binary_remote_addr zone=creq:10 mrate=1r/s;

        limit_req zone=creq burst=5;

    限制平均每秒不超過一個請求,同時允許超過頻率限制的請求數不多于5個。

如果不希望超過的請求被延遲,可以用nodelay參數,如:

limit_req zone=ttlsa_com burst=5 nodelay;

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

        data/www.baidu.com/download/;

可能要對某些ip不做限制,需要使用到白名單。

繼續閱讀