elasticsearch入門系列">elasticsearch入門系列
810
2022-05-29
ngx_http_limit_conn_module 模塊
該模塊一般應(yīng)用在以下場景:
①、秒殺、搶購并發(fā)限制
②、下載帶寬限制
③、防止攻擊
詳細(xì)說明:
ngx_http_limit_conn_module 模塊對于一些服務(wù)器流量異常、負(fù)載過大,甚至是大流量的惡意攻擊訪問等,進(jìn)行并發(fā)數(shù)的限制。該模塊可以根據(jù)定義的鍵來限制每個(gè)鍵值的連接數(shù)。并不是所有的連接都被計(jì)算在內(nèi),只有當(dāng)服務(wù)器處理了一個(gè)請求,并且整個(gè)請求頭已經(jīng)被讀取時(shí),才會(huì)計(jì)算連接。
該模塊提供了兩個(gè)配置參數(shù),limit_conn_zone 和 limit_conn ,其中 limit_conn_zone 只能配置在 http段,而 limit_conn 則可以配置于http、server、location 段中。
一、limit_conn_zone
語法:limit_conn_zone $variable zone=name:size;
配置段:http
參數(shù)說明:
$variable:定義的鍵,要限流的維度;
zone=name: 定義區(qū)域名稱(名稱隨意起名),主要作用與后面的 limit_conn中對應(yīng)就好。
size: 定義各個(gè)鍵共享內(nèi)存空間大小。
該指令描述會(huì)話狀態(tài)存儲區(qū)域。鍵的狀態(tài)中保存了當(dāng)前連接數(shù),鍵的值可以是特定變量的任何非空值(空值不會(huì)被考慮)。比如有以下配置示例:
#限制連接數(shù)``limit_conn_zone $binary_remote_addr zone=``test``:20m;
注釋:
①、客戶端的ip地址作為鍵。注意,這里使用的是 $binary_remote_addr 變量,而不是 $remote_addr 變量。 $binary_remote_addr 變量作用是 獲取二進(jìn)制格式的客戶端地址。而
r
e
m
o
t
e
a
d
d
r
變量的作用是獲取客戶端的
i
p
地址。
remote_addr 變量的作用是 獲取客戶端的ip地址。
remotea ddr變量的作用是獲取客戶端的ip地址。binary_remote_addr 和 $remote_addr 這兩個(gè)變量是nginx中的眾多內(nèi)置變量中的兩個(gè)。
②、$remote_addr 變量的長度為7字節(jié)到15字節(jié),而存儲狀態(tài)在32位平臺中占用32字節(jié)或64字節(jié),在64位平臺中占用64字節(jié)。
③、$binary_remote_addr 變量的長度是固定的4字節(jié),存儲狀態(tài)在32位平臺中占用32字節(jié)或64字節(jié),在64位平臺中占用64字節(jié)。
④、1M共享空間可以保存3.2萬個(gè)32位的狀態(tài),1.6萬個(gè)64位的狀態(tài)。
⑤、如果共享內(nèi)存空間被耗盡,服務(wù)器將會(huì)對后續(xù)所有的請求返回 503 (Service Temporarily Unavailable) 錯(cuò)誤。
二、limit_conn
語法:limit_conn zone_name number
配置段:http、server、location
參數(shù)說明:
zone_name:是上面limit_conn_zone 中的zone定義的(在本篇博文中也就是test)。
number:是并發(fā)連接數(shù)量。
該指令指定每個(gè)給定鍵值的最大同時(shí)連接數(shù),當(dāng)超過這個(gè)數(shù)字的時(shí)候會(huì)返回503(Service )錯(cuò)誤。limit_conn是對某個(gè)key對應(yīng)的總的網(wǎng)絡(luò)連接數(shù)進(jìn)行限流。可以按照IP來限制IP維度的總連接數(shù),或者按照服務(wù)域名來限制某個(gè)域名的總的連接數(shù)。(只有那些被nginx處理的且已經(jīng)讀取了整個(gè)請求頭的請求連接才會(huì)被計(jì)數(shù)器統(tǒng)計(jì))。如(同一IP同一時(shí)間只允許有20個(gè)連接):
三、配置使用示例
limit_conn_zone $binary_remote_addr zone=test:20m;
主要用來定義變量、zone名稱、共享內(nèi)存大小
limit_conn test 20;
將前面定義的test進(jìn)行配置,并且限制同一IP并發(fā)連接數(shù)為20
示例截圖如下:
配置方法如下:
①、在nginx.conf里的http{}里加上如下代碼:
#以下參數(shù)根據(jù)各自需求進(jìn)行對應(yīng)的選取配置,不是把下面列出的2行配置代碼都復(fù)制到對應(yīng)的http段里面去的。` `limit_conn_zone $binary_remote_addr zone=perip:10m;``limit_conn_zone $server_name zone=perserver:10m;
②、在需要限制并發(fā)數(shù)和下載帶寬的網(wǎng)站配置server{}里加上如下代碼:
#以下參數(shù)根據(jù)各自需求進(jìn)行對應(yīng)的選取配置,不是把下面列出的3行配置代碼都復(fù)制到對應(yīng)的server段里面去的。` `limit_conn perip 2;``limit_conn perserver 20;``limit_rate 100k;
補(bǔ)充說明下參數(shù):
$binary_remote_addr 是限制同一客戶端ip地址。
$server_name 是限制同一server最大并發(fā)數(shù)。
limit_conn 為限制并發(fā)連接數(shù)。
limit_rate 為限制下載速度。
四、注意事項(xiàng)
事務(wù)都具有兩面性的。ngx_http_limit_conn_module 模塊雖說可以解決當(dāng)前面臨的并發(fā)問題,但是會(huì)引入另外一些問題的。如前端如果有做LVS或反代,而我們后端啟用了該模塊功能,那不是非常多503錯(cuò)誤了?這樣的話,可以在前端啟用該模塊,要么就是設(shè)置白名單。
HTTP
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。