author:咔咔前端
wechat:fangkangfknode
這裏我就複製一份別人寫的不錯的總結,我就簡單說一下$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指令解釋code
limit_conn_zone
語法: limit_conn_zone $variable zone=name:size;
默認值: none
配置段: httpserver
該指令描述會話狀態存儲區域。鍵的狀態中保存了當前鏈接數,鍵的值能夠是特定變量的任何非空值(空值將不會被考慮)。$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
配置段:http, server, location
指定每一個給定鍵值的最大同時鏈接數,當超過這個數字時被返回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;
默認值: none
配置段: http
設置一塊共享內存限制域用來保存鍵值的狀態參數。 特別是保存了當前超出請求的數量。 鍵的值就是指定的變量(空值不會被計算)。如
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;
配置段: http, server, location
設置你所但願的日誌級別,當服務器由於頻率太高拒絕或者延遲處理請求時能夠記下相應級別的日誌。 延遲記錄的日誌級別比拒絕的低一個級別;好比, 若是設置「limit_req_log_level notice」, 延遲的日誌就是info級別。
limit_req_status
語法: limit_req_status code;
默認值: limit_req_status 503;
配置段: http, server, location
該指令在1.3.15版本引入。設置拒絕請求的響應狀態碼。
limit_req
語法: limit_req zone=name [burst=number] [nodelay];
默認值: —
配置段: http, server, location
設置對應的共享內存限制域和容許被處理的最大請求數閾值。 若是請求的頻率超過了限制域配置的值,請求處理會被延遲,因此全部的請求都是以定義的頻率被處理的。 超過頻率限制的請求會被延遲,直到被延遲的請求數超過了定義的閾值,這時,這個請求會被終止,並返回503 (Service Temporarily Unavailable) 錯誤。這個閾值的默認值爲0。如:
limit_req_zone $binary_remote_addr zone=creq:10 mrate=1r/s;
server{
location /www.baidu.com/{
limit_req zone=creq burst=5;
}
}
限制平均每秒不超過一個請求,同時容許超過頻率限制的請求數很少於5個。
若是不但願超過的請求被延遲,能夠用nodelay參數,如:
limit_req zone=ttlsa_com burst=5 nodelay;
完整實例配置
http{
limit_req_zone $binary_remote_addr zone=creq:10m rate=1r/s;
server{
location ^~/download/{
limit_req zone=creq burst=5;
data/www.baidu.com/download/;
}
}
}
可能要對某些IP不作限制,須要使用到白名單。