日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Nginx >内容正文

Nginx

Nginx--流量限制(最有用的功能之一)

發(fā)布時(shí)間:2023/12/20 Nginx 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Nginx--流量限制(最有用的功能之一) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

一、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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。