這篇文章主要介紹了Nginx如何限流,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)公司10多年企業(yè)網(wǎng)站建設(shè)服務(wù);為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì)及高端網(wǎng)站定制服務(wù),企業(yè)網(wǎng)站建設(shè)及推廣,對(duì)成都資質(zhì)代辦等多個(gè)方面擁有多年建站經(jīng)驗(yàn)的網(wǎng)站建設(shè)公司。
1 漏桶和令牌桶算法的概念
漏桶算法(Leaky Bucket):主要目的是控制數(shù)據(jù)注入到網(wǎng)絡(luò)的速率,平滑網(wǎng)絡(luò)上的突發(fā)流量。漏桶算法提供了一種機(jī)制,通過(guò)它,突發(fā)流量可以被整形以便為網(wǎng)絡(luò)提供一個(gè)穩(wěn)定的流量。漏桶算法的示意圖如下圖所示,請(qǐng)求先進(jìn)入到漏桶里,漏桶以一定的速度出水,當(dāng)水請(qǐng)求過(guò)大會(huì)直接溢出,可以看出漏桶算法能強(qiáng)行限制數(shù)據(jù)的傳輸速率。
令牌桶算法(Token Bucket):是網(wǎng)絡(luò)流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一種算法。典型情況下,令牌桶算法用來(lái)控制發(fā)送到網(wǎng)絡(luò)上的數(shù)據(jù)的數(shù)目,并允許突發(fā)數(shù)據(jù)的發(fā)送。令牌桶算法示意圖如下圖所示,大小固定的令牌桶可自行以恒定的速率源源不斷地產(chǎn)生令牌。如果令牌不被消耗,或者被消耗的速度小于產(chǎn)生的速度,令牌就會(huì)不斷地增多,直到把桶填滿(mǎn)。后面再產(chǎn)生的令牌就會(huì)從桶中溢出。最后桶中可以保存的最大令牌數(shù)永遠(yuǎn)不會(huì)超過(guò)桶的大小。
2 兩種算法的區(qū)別
兩者主要區(qū)別在于“漏桶算法”能夠強(qiáng)行限制數(shù)據(jù)的傳輸速率,而“令牌桶算法”在能夠限制數(shù)據(jù)的平均傳輸速率外,還允許某種程度的突發(fā)傳輸。在“令牌桶算法”中,只要令牌桶中存在令牌,那么就允許突發(fā)地傳輸數(shù)據(jù)直到達(dá)到用戶(hù)配置的門(mén)限,所以它適合于具有突發(fā)特性的流量。
3 按請(qǐng)求速率限速
按請(qǐng)求速率限速是指限制IP發(fā)送請(qǐng)求的速率,超出指定速率后,Nginx將直接拒絕更多的請(qǐng)求。采用漏桶算法實(shí)現(xiàn)。下面從一些實(shí)驗(yàn)數(shù)據(jù)上來(lái)深入的了解這個(gè)模塊,先簡(jiǎn)單介紹一下該模塊的配置方式,如下圖所示(配置需要在Nginx配置和域名配置里面同時(shí)修改),使用limit_req_zone關(guān)鍵字,定義一個(gè)名為tip大小為10MB的共享內(nèi)存區(qū)域(zone),用來(lái)存放限速相關(guān)的統(tǒng)計(jì)信息,限速的key值為二進(jìn)制的IP地址($binary_remote_addr),限速上限(rate)為2r/s。
將上述規(guī)則應(yīng)用到/search目錄(單個(gè)IP的訪問(wèn)速度被限制在了2請(qǐng)求/秒,超過(guò)這個(gè)限制的訪問(wèn)將直接被Nginx拒絕)。burst和nodelay的作用稍后解釋。(zone=tip:10m表示會(huì)話空間的存儲(chǔ)大小為10m)。
4 3個(gè)實(shí)驗(yàn)案例
實(shí)驗(yàn)1、討論2個(gè)請(qǐng)求在1s內(nèi)的執(zhí)行過(guò)程
修改配置下圖所示:
我們使用ab工具模擬1s發(fā)送2個(gè)請(qǐng)求。
只有一個(gè)請(qǐng)求成功了,查看了一下執(zhí)行時(shí)間:
1ms內(nèi)完成了所有請(qǐng)求,考慮到每秒兩個(gè)請(qǐng)求可能是分時(shí)間段來(lái)來(lái)完成的,二分法做了大量延遲處理的嘗試,當(dāng)兩個(gè)請(qǐng)求之間的時(shí)延大于0.5s時(shí)第二個(gè)請(qǐng)求才會(huì)成功。
結(jié)論:Nginx的限流統(tǒng)計(jì)是基于毫秒的,我們?cè)O(shè)置的速度是2r/s,轉(zhuǎn)換一下就是500ms內(nèi)單個(gè)IP只允許通過(guò)1個(gè)請(qǐng)求,從501ms開(kāi)始才允許通過(guò)第二個(gè)請(qǐng)求。
實(shí)驗(yàn)2、burst允許緩存處理突發(fā)請(qǐng)求
如果短時(shí)間內(nèi)發(fā)送了大量請(qǐng)求,Nginx按照毫秒級(jí)精度統(tǒng)計(jì),超出限制的請(qǐng)求直接拒絕。這在實(shí)際場(chǎng)景中未免過(guò)于苛刻,真實(shí)網(wǎng)絡(luò)環(huán)境中請(qǐng)求到來(lái)不是勻速的,很可能有請(qǐng)求“突發(fā)”的情況。Nginx考慮到了這種情況,可以通過(guò)burst關(guān)鍵字開(kāi)啟對(duì)突發(fā)請(qǐng)求的緩存處理,而不是直接拒絕。(類(lèi)似令牌桶算法)
修改Nginx配置如下:
我們加入了burst=4,意思是每個(gè)key(此處是每個(gè)IP)最多允許4個(gè)突發(fā)請(qǐng)求的到來(lái)。使用ab工具發(fā)送6個(gè)請(qǐng)求,結(jié)果會(huì)怎樣呢?
發(fā)送耗時(shí)2ms,完成處理時(shí)間2437ms,每個(gè)請(qǐng)求的處理時(shí)間。
由于ngnix 500ms處理完第一個(gè)請(qǐng)求后,501ms才會(huì)處理第二個(gè)請(qǐng)求,所以5個(gè)請(qǐng)求(去掉503那個(gè))耗時(shí)500ms*4+416ms=2416ms(本地實(shí)測(cè),不同Nginx性能有所差異),或者使用ab工具并發(fā)來(lái)處理這些請(qǐng)求,也會(huì)有同樣的效果。
我們?cè)賮?lái)觀察一下發(fā)送時(shí)間,所有的請(qǐng)求基本在10ms內(nèi)發(fā)起,這樣便導(dǎo)致了6個(gè)請(qǐng)求中,去掉第一個(gè)和緩沖區(qū)的4個(gè),第二個(gè)被拒絕掉。
實(shí)驗(yàn)3、nodelay降低排隊(duì)時(shí)間
通過(guò)設(shè)置burst參數(shù),我們可以允許Nginx緩存處理一定程度的突發(fā),多余的請(qǐng)求可以先放到隊(duì)列里,慢慢處理,這起到了平滑流量的作用。但是如果隊(duì)列設(shè)置的比較大,請(qǐng)求排隊(duì)的時(shí)間就會(huì)比較長(zhǎng),這對(duì)用戶(hù)很不友好。nodelay參數(shù)允許請(qǐng)求在排隊(duì)的時(shí)候就立即被處理,也就是說(shuō)只要請(qǐng)求能夠進(jìn)入burst隊(duì)列,就會(huì)立即被后臺(tái)worker處理。
延續(xù)實(shí)驗(yàn)2的配置,我們加入nodelay選項(xiàng):
與實(shí)驗(yàn)2相比直觀上的效果就是Nginx同時(shí)出現(xiàn)6條日志,即6個(gè)請(qǐng)求是同時(shí)被處理的,而實(shí)驗(yàn)2日志是逐條生成的,間隔0.5s,視覺(jué)上有卡頓。
雖然設(shè)置burst和nodelay能夠降低突發(fā)請(qǐng)求的處理時(shí)間,但是長(zhǎng)期來(lái)看并不會(huì)提高吞吐量的上限,長(zhǎng)期吞吐量的上限是由rate決定的,因?yàn)閚odelay只能保證burst的請(qǐng)求被立即處理,加入了nodelay參數(shù)之后的限速算法還算是漏桶算法,當(dāng)令牌桶算法的token為耗盡時(shí),由于它有一個(gè)請(qǐng)求隊(duì)列,所以會(huì)把接下來(lái)的請(qǐng)求緩存下來(lái),緩存多少受限于隊(duì)列大小。假如server已經(jīng)過(guò)載,緩存隊(duì)列越來(lái)越長(zhǎng),即使過(guò)了很久請(qǐng)求被處理了,對(duì)用戶(hù)來(lái)說(shuō)也沒(méi)什么價(jià)值了。所以當(dāng)token不夠用時(shí),最明智的做法就是直接拒絕用戶(hù)的請(qǐng)求,即漏桶算法。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Nginx如何限流”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
分享標(biāo)題:Nginx如何限流
本文來(lái)源:http://chinadenli.net/article6/gjshog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、域名注冊(cè)、網(wǎng)站內(nèi)鏈、網(wǎng)站建設(shè)、品牌網(wǎng)站制作、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)