Nginx--流量限制(最有用的功能之一)
目錄
一、Nginx限流
1、漏桶算法(限制請(qǐng)求次數(shù))
2、令牌桶算法(限制請(qǐng)求速度)
3、計(jì)數(shù)器(限制連接數(shù))
4、兩種算法的區(qū)別
二、漏桶算法的基本配置
1、控制速率
①添加內(nèi)容
②配置?server,使用?limit_req?指令應(yīng)用限流
③測(cè)試
2.處理突發(fā)流量?
3.配置 ?nodelay
三、?令牌桶算法配置
? ? ? ? ??1、限制下載速度?
2、添加 limit_rate_after 1m ?命令
3、限制連接數(shù)
流量限制(rate-limiting)是nginx最有用的功能之一,卻經(jīng)常被錯(cuò)誤理解和錯(cuò)誤配置。它允許我們限制用戶在給定時(shí)間內(nèi)可以發(fā)出的HTTP請(qǐng)求數(shù)量。例如請(qǐng)求網(wǎng)站首頁(yè)的GET請(qǐng)求,表單登錄的POST請(qǐng)求等。
速率限制可以出于安全目的使用。例如,可以降低暴力破解賬號(hào)密碼的攻擊速度。通過(guò)將傳入請(qǐng)求速率限制為實(shí)際用戶的典型值,并(通過(guò)記錄)標(biāo)識(shí)目標(biāo)URL,它可以幫助我們防御DDOS攻擊。而更為通用的用法是,防止上游應(yīng)用程序服務(wù)器同時(shí)被太多用戶請(qǐng)求所淹沒(méi)。
一、Nginx限流
Nginx 提供兩種限流方式,一是控制速率,二是控制并發(fā)連接數(shù)。
1、漏桶算法(限制請(qǐng)求次數(shù))
漏桶算法思路很簡(jiǎn)單,請(qǐng)求先進(jìn)入到漏桶里,漏桶以固定的速度出水,也就是處理請(qǐng)求,當(dāng)水加的過(guò)快,則會(huì)直接溢出,也就是拒絕請(qǐng)求,可以看出漏桶算法能強(qiáng)行限制數(shù)據(jù)的傳輸速率。
是對(duì)于很多場(chǎng)景來(lái)說(shuō),除了要求能夠限制數(shù)據(jù)的平均傳輸速率外,還要求允許某種程度的突發(fā)傳輸。這時(shí)候漏桶算法可能就不合適了,令牌桶算法更為適合。
2、令牌桶算法(限制請(qǐng)求速度)
對(duì)于很多應(yīng)用場(chǎng)景來(lái)說(shuō),除了要求能夠限制數(shù)據(jù)的平均傳輸速率外,還要求允許某種程度的突發(fā)傳輸。這時(shí)候漏桶算法可能就不合適了,令牌桶算法更為適合。
令牌桶算法的原理是系統(tǒng)以恒定的速率產(chǎn)生令牌,然后把令牌放到令牌桶中,令牌桶有一個(gè)容量,當(dāng)令牌桶滿了的時(shí)候,再向其中放令牌,那么多余的令牌會(huì)被丟棄;當(dāng)想要處理一個(gè)請(qǐng)求的時(shí)候,需要從令牌桶中取出一個(gè)令牌,如果此時(shí)令牌桶中沒(méi)有令牌,那么則拒絕該請(qǐng)求。
3、計(jì)數(shù)器(限制連接數(shù))
計(jì)數(shù)器比較簡(jiǎn)單粗暴,比如我們限制的是1s能夠通過(guò)的請(qǐng)求數(shù),實(shí)現(xiàn)的思路就是從第一個(gè)請(qǐng)求進(jìn)來(lái)開始計(jì)時(shí),在接下來(lái)的1s內(nèi),每個(gè)請(qǐng)求進(jìn)來(lái)請(qǐng)求數(shù)就+1,超過(guò)最大請(qǐng)求數(shù)的請(qǐng)求會(huì)被拒絕,等到1s結(jié)束后計(jì)數(shù)清零,重新開始計(jì)數(shù)。
這種方式有個(gè)很大的弊端:比如前10ms已經(jīng)通過(guò)了最大的請(qǐng)求數(shù),那么后面的990ms的請(qǐng)求只能拒絕,這種現(xiàn)象叫做“突刺現(xiàn)象”。
4、兩種算法的區(qū)別
漏桶算法輸入的時(shí)候請(qǐng)求不固定,但都會(huì)在漏桶里邊先保存起來(lái)(小于漏桶的容量),然后輸出的時(shí)候采用的是恒定的速率執(zhí)行請(qǐng)求,有點(diǎn)像隊(duì)列的先進(jìn)先出,只是隊(duì)列中的元素出隊(duì)的時(shí)間間隔一致。
令牌桶算法跟漏桶算法剛好相反,令牌桶的大小就是接口所能承載的最大訪問(wèn)量,令牌的發(fā)放是恒速的,而最終能在某一時(shí)間處理的請(qǐng)求數(shù)不是恒定的,這取決于單位時(shí)間內(nèi)令牌桶中的令牌數(shù)量。
從作用上來(lái)說(shuō),漏桶和令牌桶算法最明顯的區(qū)別就是是否允許突發(fā)流量(burst)的處理,漏桶算法能夠強(qiáng)行限制數(shù)據(jù)的實(shí)時(shí)傳輸(處理)速率,對(duì)突發(fā)流量不做額外處理;而令牌桶算法能夠在限制數(shù)據(jù)的平均傳輸速率的同時(shí)允許某種程度的突發(fā)傳輸。
Nginx官方版本限制IP的連接和并發(fā)分別有兩個(gè)模塊:
limit_req_zone?用來(lái)限制單位時(shí)間內(nèi)的請(qǐng)求數(shù),即速率限制,采用的漏桶算法 "leaky bucket"。
limit_req_conn?用來(lái)限制同一時(shí)間連接數(shù),即并發(fā)限制。
二、漏桶算法的基本配置
1、控制速率
①添加內(nèi)容
vim /usr/local/nginx/conf/nginx.conf
在http中添加
limit_req_zone?$binary_remote_addr?zone=one:10m?rate=1r/s;
limit_req_zone:用來(lái)限制單位時(shí)間內(nèi)的請(qǐng)求數(shù)
$binary_remote_addr:定義限流對(duì)象,binary_remote_addr是一種key,表示基于?remote_addr(客戶端IP)?來(lái)做限流,binary_?的目的是壓縮內(nèi)存占用量。
zone=one:10m:定義共享內(nèi)存區(qū)來(lái)存儲(chǔ)訪問(wèn)信息,?one:10m?表示一個(gè)大小為10M,名字為one的內(nèi)存區(qū)域。1M能存儲(chǔ)16000 IP地址的訪問(wèn)信息,10M可以存儲(chǔ)16W IP地址訪問(wèn)信息。
rate=1r/s:用于設(shè)置最大訪問(wèn)速率,rate=10r/s?表示每秒最多處理10個(gè)請(qǐng)求。Nginx 實(shí)際上以毫秒為粒度來(lái)跟蹤請(qǐng)求信息,因此 10r/s 實(shí)際上是限制:每100毫秒處理一個(gè)請(qǐng)求。這意味著,自上一個(gè)請(qǐng)求處理完后,若后續(xù)100毫秒內(nèi)又有請(qǐng)求到達(dá),將拒絕處理該請(qǐng)求。
②配置?server,使用?limit_req?指令應(yīng)用限流
在location中添加
limit_req zone=one;
③測(cè)試
訪問(wèn)頁(yè)面,在一秒內(nèi)快速刷新
2.處理突發(fā)流量?
現(xiàn)在超過(guò)1個(gè)請(qǐng)求就丟棄,沒(méi)有“桶”的概念,所以我們需要添加一個(gè)“桶”
在 ?limit_req zone=one ?后加上brust=8;
Burst:爆發(fā),處理突發(fā)請(qǐng)求
burst參數(shù)定義了超出zone指定速率的情況下(示例中的mylimit區(qū)域,速率限制在每秒10個(gè)請(qǐng)求,或每100毫秒一個(gè)請(qǐng)求),客戶端還能發(fā)起多少請(qǐng)求。上一個(gè)請(qǐng)求100毫秒內(nèi)到達(dá)的請(qǐng)求將會(huì)被放入隊(duì)列,我們將隊(duì)列大小設(shè)置為8。
這意味著,如果從一個(gè)給定IP地址發(fā)送21個(gè)請(qǐng)求,Nginx會(huì)立即將第一個(gè)請(qǐng)求發(fā)送到上游服務(wù)器群,然后將余下20個(gè)請(qǐng)求放在隊(duì)列中。然后每100毫秒轉(zhuǎn)發(fā)一個(gè)排隊(duì)的請(qǐng)求,只有當(dāng)傳入請(qǐng)求使隊(duì)列中排隊(duì)的請(qǐng)求數(shù)超過(guò)20時(shí),Nginx才會(huì)向客戶端返回503。
?
查看發(fā)現(xiàn),我們?cè)L問(wèn)了21個(gè),一個(gè)請(qǐng)求立即進(jìn)到上游服務(wù)器群,進(jìn)入桶里8個(gè),失敗12個(gè)。
不過(guò),單獨(dú)使用 burst 參數(shù)并不實(shí)用。假設(shè) burst=50 ,rate依然為10r/s,排隊(duì)中的50個(gè)請(qǐng)求雖然每100ms會(huì)處理一個(gè),但第50個(gè)請(qǐng)求卻需要等待 50 * 100ms即 5s,這么長(zhǎng)的處理時(shí)間自然難以接受。
因此,burst 往往結(jié)合 nodelay 一起使用。
3.配置 ?nodelay
表示我不要任何的延遲,只要burst桶一滿就返回503 報(bào)錯(cuò)
配置完成后就沒(méi)有等待的感覺(jué)
效果相當(dāng)于每秒10個(gè)請(qǐng)求的“流量限制”。如果希望不限制兩個(gè)請(qǐng)求間允許間隔的情況下實(shí)施“流量限制”,nodelay參數(shù)是很實(shí)用的。
報(bào)錯(cuò)日志可以去 ?/usr/local/nginx/logs/access.logs ??里去查看
三、?令牌桶算法配置
limit_req?
令牌以每秒五個(gè)的速度往桶里放牌子;每個(gè)請(qǐng)求領(lǐng)一個(gè)牌子
一個(gè)請(qǐng)求可以領(lǐng)多個(gè)牌子,增加請(qǐng)求速率
1、限制下載速度?
在配置中添加 ?
?limit_rate 1k ??:限制下載速度在1k左右
2、添加 limit_rate_after 1m ?命令
就是在下載多少內(nèi)容后再以limit_rate限制的速率下載,多用于瀏覽視頻
先給你一點(diǎn)先看,再慢慢給你緩存觀看,等你欲罷不能的時(shí)候,讓你沖會(huì)員,沖完會(huì)員就快了!!!
先給你下載5M,再以1k速度左右下載
3、限制連接數(shù)
添加內(nèi)容
limit_conn_zone $binary_remote_addr zone=two:10m;
limit_conn_zone?1?表示限制單個(gè)IP同時(shí)最多能持有1個(gè)連接。
limit_conn two?1?表示虛擬主機(jī)(server) 同時(shí)能處理并發(fā)連接的總數(shù)。
需要注意的是:只有當(dāng)?request header?被后端server處理后,這個(gè)連接才進(jìn)行計(jì)數(shù)。
全部訪問(wèn)成功了,看不出什么限制效果,我們添加限制速度
發(fā)現(xiàn)失敗了大部分,因?yàn)橄拗屏瞬l(fā)數(shù),他就會(huì)等待第一個(gè)請(qǐng)求處理完成后,才能處理第二個(gè),而我們?cè)黾恿讼拗铺幚硭俣?#xff0c;處理速度很慢,所以就失敗了很多個(gè)?
總結(jié)
以上是生活随笔為你收集整理的Nginx--流量限制(最有用的功能之一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 手机展示mysql实例_mysql 视图
- 下一篇: 云计算学习之路——Nginx流量控制