Nginx限流模塊包含
- 連接數(shù)限流模塊 ngx_http_limit_conn_module
- 漏桶算法實(shí)現(xiàn)的請(qǐng)求限流模塊 ngx_http_limit_req_module
-
ngx_http_limit_conn_module
我們經(jīng)常會(huì)遇到這種情況月而,服務(wù)器流量異常蛛株,負(fù)載過(guò)大等等。對(duì)于大流量惡意的攻擊訪問(wèn)负蚊,會(huì)帶來(lái)帶寬的浪費(fèi)滩报,服務(wù)器壓力,影響業(yè)務(wù)抠藕,往往考慮對(duì)同一個(gè)ip的連接數(shù)烟号,并發(fā)數(shù)進(jìn)行限制。
ngx_http_limit_conn_module 模塊來(lái)實(shí)現(xiàn)該需求翻擒。該模塊可以根據(jù)定義的鍵來(lái)限制每個(gè)鍵值的連接數(shù)氓涣,如同一個(gè)IP來(lái)源的連接數(shù)。并不是所有的連接都會(huì)被該模塊計(jì)數(shù)陋气,只有那些正在被處理的請(qǐng)求(這些請(qǐng)求的頭信息已被完全讀入)所在的連接才會(huì)被計(jì)數(shù)劳吠。
我們可以在nginx_conf的http{}中加上如下配置實(shí)現(xiàn)限制:
# 限制每個(gè)用戶的并發(fā)連接數(shù),取名one
limit_conn_zone $binary_remote_addr zone=one:10m;
# 配置記錄被限流后的日志級(jí)別恩伺,默認(rèn)error級(jí)別
limit_conn_log_level error;
# 配置被限流后返回的狀態(tài)碼赴背,默認(rèn)返回503
limit_conn_status 503;
然后在server{}里加上如下代碼:
#限制用戶并發(fā)連接數(shù)為1
limit_conn one 1;
另外剛才是配置針對(duì)單個(gè)IP的并發(fā)限制,還是可以針對(duì)域名進(jìn)行并發(fā)限制,配置和客戶端IP類似凰荚。
#http{}段配置
limit_conn_zone $ server_name zone=perserver:10m;
#server{}段配置
limit_conn perserver 1;
-
ngx_http_limit_req_module
上面我們使用到了ngx_http_limit_conn_module 模塊燃观,來(lái)限制連接數(shù)。那么請(qǐng)求數(shù)的限制該怎么做呢便瑟?這就需要通過(guò)ngx_http_limit_req_module 模塊來(lái)實(shí)現(xiàn)缆毁,該模塊可以通過(guò)定義的鍵值來(lái)限制請(qǐng)求處理的頻率。
特別的到涂,可以限制來(lái)自單個(gè)IP地址的請(qǐng)求處理頻率脊框。限制的方法是使用了漏斗算法,每秒固定處理請(qǐng)求數(shù)践啄,推遲過(guò)多請(qǐng)求浇雹。如果請(qǐng)求的頻率超過(guò)了限制域配置的值,請(qǐng)求處理會(huì)被延遲或被丟棄屿讽,所以所有的請(qǐng)求都是以定義的頻率被處理的昭灵。
在http{}中配置
#區(qū)域名稱為one,大小為10m伐谈,平均處理的請(qǐng)求頻率不能超過(guò)每秒一次烂完。
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
在server{}中配置
#設(shè)置每個(gè)IP桶的數(shù)量為5
limit_req zone=one burst=5;
上面設(shè)置定義了每個(gè)IP的請(qǐng)求處理只能限制在每秒1個(gè)。并且服務(wù)端可以為每個(gè)IP緩存5個(gè)請(qǐng)求诵棵,如果操作了5個(gè)請(qǐng)求抠蚣,請(qǐng)求就會(huì)被丟棄。