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