一,背景
我們經(jīng)常會遇到這種情況,服務器流量異常,負載過大等等。對于大流量惡意的攻擊訪問,會帶來帶寬的浪費,服務器壓力,影響業(yè)務,往往考慮對同一個ip的連接數(shù),并發(fā)數(shù)進行限制。http_limit_conn_module 模塊來實現(xiàn)。該模塊可以根據(jù)定義的鍵來限制每個鍵值的連接數(shù),如同一個IP來源的連接數(shù)。并不是所有的連接都會被該模塊計數(shù),只有那些正在被處理的請求(這些請求的頭信息已被完全讀入)所在的連接才會被計數(shù)。http_limit_req_module 模塊來實現(xiàn),該模塊可以通過定義的 鍵值來限制請求處理的頻率。特別的,可以限制來自單個IP地址的請求處理頻率。 限制的方法如同漏斗,每秒固定處理請求數(shù),推遲過多請求。
二,配置語法
1,http_limit_conn_module指令解釋
limit_conn_zone
語法: limit_conn_zone $variable zone=name:size;
默認值: none
配置段: http
該指令描述會話狀態(tài)存儲區(qū)域。鍵的狀態(tài)中保存了當前連接數(shù),鍵的值可以是特定變量的任何非空值(空值將不會被考慮)。$variable定義鍵,zone=name定義區(qū)域名稱,后面的limit_conn指令會用到的。size定義各個鍵共享內(nèi)存空間大小。如:
limit_conn_zone $binary_remote_addr zone=addr:10m;
注釋:客戶端的IP地址作為鍵。注意,這里使用的是$binary_remote_addr變量,而不是$remote_addr變量。
$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萬個32位的狀態(tài),1.6萬個64位的狀態(tài)。
如果共享內(nèi)存空間被耗盡,服務器將會對后續(xù)所有的請求返回 503 (Service Temporarily Unavailable) 錯誤。
limit_zone 指令和limit_conn_zone指令同等意思,已經(jīng)被棄用,就不再做說明了。
limit_conn_log_level
語法:limit_conn_log_level info | notice | warn | error
默認值:error
配置段:http, server, location
當達到最大限制連接數(shù)后,記錄日志的等級。
limit_conn
語法:limit_conn zone_name number
默認值:none
配置段:http, server, location
指定每個給定鍵值的最大同時連接數(shù),當超過這個數(shù)字時被返回503 (Service Temporarily Unavailable)錯誤。如:
limit_conn_zone $binary_remote_addrzone=addr:10m;server{ location /www.baidu.com/{ limit_conn addr 1; }}
同一IP同一時間只允許有一個連接。
當多個 limit_conn 指令被配置時,所有的連接數(shù)限制都會生效。比如,下面配置不僅會限制單一IP來源的連接數(shù),同時也會限制單一虛擬服務器的總連接數(shù):
新聞熱點
疑難解答