這篇文章給大家分享的是有關(guān)Nginx如何實(shí)現(xiàn)限流的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
創(chuàng)新互聯(lián)成都企業(yè)網(wǎng)站建設(shè)服務(wù),提供成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、成都外貿(mào)網(wǎng)站建設(shè)網(wǎng)站開發(fā),網(wǎng)站定制,建網(wǎng)站,網(wǎng)站搭建,網(wǎng)站設(shè)計(jì),自適應(yīng)網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì)師打造企業(yè)風(fēng)格網(wǎng)站,提供周到的售前咨詢和貼心的售后服務(wù)。歡迎咨詢做網(wǎng)站需要多少錢:18982081108
Nginx現(xiàn)在已經(jīng)是最火的負(fù)載均衡之一,在流量陡增的互聯(lián)網(wǎng)面前,接口限流也是很有必要的,尤其是針對(duì)高并發(fā)的場(chǎng)景。Nginx的限流主要是兩種方式:限制訪問(wèn)頻率和限制并發(fā)連接數(shù)。
限流(rate limiting)是NGINX眾多特性中最有用的,也是經(jīng)常容易被誤解和錯(cuò)誤配置的,特性之一。該特性可以限制某個(gè)用戶在一個(gè)給定時(shí)間段內(nèi)能夠產(chǎn)生的HTTP請(qǐng)求數(shù)。請(qǐng)求可以簡(jiǎn)單到就是一個(gè)對(duì)于主頁(yè)的GET請(qǐng)求或者一個(gè)登陸表格的POST請(qǐng)求。
限流也可以用于安全目的上,比如減慢暴力密碼破解攻擊。通過(guò)限制進(jìn)來(lái)的請(qǐng)求速率,并且(結(jié)合日志)標(biāo)記出目標(biāo)URLs來(lái)幫助防范DDoS攻擊。一般地說(shuō),限流是用在保護(hù)上游應(yīng)用服務(wù)器不被在同一時(shí)刻的大量用戶請(qǐng)求湮沒(méi)。
NGINX限流是如何工作的
NGINX限流使用漏桶算法(leaky bucket algorithm),該算法廣泛應(yīng)用于通信和基于包交換計(jì)算機(jī)網(wǎng)絡(luò)中,用來(lái)處理當(dāng)帶寬被限制時(shí)的突發(fā)情況。和一個(gè)從上面進(jìn)水,從下面漏水的桶的原理很相似;如果進(jìn)水的速率大于漏水的速率,這個(gè)桶就會(huì)發(fā)生溢出。
在請(qǐng)求處理過(guò)程中,水代表從客戶端來(lái)的請(qǐng)求,而桶代表了一個(gè)隊(duì)列,請(qǐng)求在該隊(duì)列中依據(jù)先進(jìn)先出(FIFO)算法等待被處理。漏的水代表請(qǐng)求離開緩沖區(qū)并被服務(wù)器處理,溢出代表了請(qǐng)求被丟棄并且永不被服務(wù)。
一、限制訪問(wèn)頻率(正常流量)
Nginx中我們使用ngx_http_limit_req_module模塊來(lái)限制請(qǐng)求的訪問(wèn)頻率,基于漏桶算法原理實(shí)現(xiàn)。接下來(lái)我們使用 nginx limit_req_zone 和 limit_req 兩個(gè)指令,限制單個(gè)IP的請(qǐng)求處理速率。
語(yǔ)法:limit_req_zone key zone rate
key :定義限流對(duì)象,binary_remote_addr 是一種key,表示基于 remote_addr(客戶端IP) 來(lái)做限流,binary_ 的目的是壓縮內(nèi)存占用量。
zone:定義共享內(nèi)存區(qū)來(lái)存儲(chǔ)訪問(wèn)信息, myRateLimit:10m 表示一個(gè)大小為10M,名字為myRateLimit的內(nèi)存區(qū)域。1M能存儲(chǔ)16000 IP地址的訪問(wèn)信息,10M可以存儲(chǔ)16W IP地址訪問(wèn)信息。
rate 用于設(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)求。
二、限制訪問(wèn)頻率(突發(fā)流量)
按上面的配置在流量突然增大時(shí),超出的請(qǐng)求將被拒絕,無(wú)法處理突發(fā)流量,那么在處理突發(fā)流量的時(shí)候,該怎么處理呢?Nginx提供了 burst 參數(shù)來(lái)解決突發(fā)流量的問(wèn)題,并結(jié)合 nodelay 參數(shù)一起使用。burst 譯為突發(fā)、爆發(fā),表示在超過(guò)設(shè)定的處理速率后能額外處理的請(qǐng)求數(shù)。
burst=20 nodelay表示這20個(gè)請(qǐng)求立馬處理,不能延遲,相當(dāng)于特事特辦。不過(guò),即使這20個(gè)突發(fā)請(qǐng)求立馬處理結(jié)束,后續(xù)來(lái)了請(qǐng)求也不會(huì)立馬處理。burst=20 相當(dāng)于緩存隊(duì)列中占了20個(gè)坑,即使請(qǐng)求被處理了,這20個(gè)位置這只能按 100ms一個(gè)來(lái)釋放。這就達(dá)到了速率穩(wěn)定,但突然流量也能正常處理的效果。
三、限制并發(fā)連接數(shù)
Nginx 的ngx_http_limit_conn_module模塊提供了對(duì)資源連接數(shù)進(jìn)行限制的功能,使用 limit_conn_zone 和 limit_conn 兩個(gè)指令就可以了。
limit_conn perip 20:對(duì)應(yīng)的key是 $binary_remote_addr,表示限制單個(gè)IP同時(shí)最多能持有20個(gè)連接。 limit_conn perserver 100:對(duì)應(yīng)的key是 $server_name,表示虛擬主機(jī)(server) 同時(shí)能處理并發(fā)連接的總數(shù)。注意,只有當(dāng) request header 被后端server處理后,這個(gè)連接才進(jìn)行計(jì)數(shù)。
感謝各位的閱讀!關(guān)于“Nginx如何實(shí)現(xiàn)限流”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
分享標(biāo)題:Nginx如何實(shí)現(xiàn)限流
當(dāng)前URL:http://jinyejixie.com/article10/gdjjgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷型網(wǎng)站建設(shè)、企業(yè)建站、響應(yīng)式網(wǎng)站、全網(wǎng)營(yíng)銷推廣、網(wǎng)站制作、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(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)