限流 四 nginx接入層限流

2022-03-14 06:45:26 字數 2044 閱讀 1361

一、nginx限流模組

接入層指的是請求流量的入口,我們可以在這裡做很多控制,比如:負載均衡,快取,限流等。

nginx中針對限流有兩個模組可以處理:

1)ngx_http_limit_req_module;連線數限流模組

2)ngx_http_limit_conn_module;請求限流模組

連線數限流模組是基於計數器方式實現的,請求限流模組是基於漏桶演算法實現的;

關於限流演算法可以參考:

除了以上兩種,我們曾在分布式限流中提到nginx+lua方式來實現限流操作,只要整合一下lua模組。或者採用openresty,它自帶了lua模組,可以實現複雜的限流場景。

本文不涉及lua模組的部分,只是簡單使用nginx預設自帶的兩個模組來實現限流操作。

二、ngx_http_limit_conn_module

連線數限流模組,和一般的計數器限流是一樣的思路,通過乙個key來訪問對應的value,value表示請求的數量。比如:限制某個ip的總請求數量,那麼我們只需要改變和訪問該ip對應的請求數量即可。

ngx_http_limit_conn_module限流模組使用**如下:

以上**:

1)limit_conn:配置的是要存放key和計數器的共享記憶體區域(addr),並指定key的最大連線樹木(這裡是1)

3) limit_conn_status: 配置限流以後返回的狀態碼;

4)limit_conn_log_level: 配置限流以後的日誌級別;

我們通過測試工具測試1秒鐘20個請求的結果: http://localhost/limit

輸出結果:

三、ngx_http_limit_req_module

請求限流模組實現的是漏桶演算法,主要是對請求的速率進行限制。

直接看具體**:

1)limit_req:配置共享記憶體區域、桶容量(突發容量,預設0)、是否延遲模式(預設延遲);

2)limit_req_zone:配置限流key、及存放key對應資訊的共享記憶體區域大小、固定請求速率;此處指定的key是「$binary_remote_addr」表示ip位址;固定請求速率使用rate引數配置,支援10r/s和60r/m,即每秒10個請求和每分鐘60個請求,不過最終都會轉換為每秒的固定請求速率(10r/s為每100毫秒處理乙個請求;60r/m,即每1000毫秒處理乙個請求)。

3)limit_conn_status:配置被限流後返回的狀態碼,預設返回503;

4)limit_conn_log_level:配置記錄被限流後的日誌級別,預設error級別。

limit_req的主要執行過程如下所示:

1、請求進入後首先判斷最後一次請求時間相對於當前時間(第一次是0)是否需要限流,如果需要限流則執行步驟2,否則執行步驟3;

2.1、如果沒有配置桶容量(burst),則桶容量為0;按照固定速率處理請求;如果請求被限流,則直接返回相應的錯誤碼(預設503);

2.2、如果配置了桶容量(burst>0)且延遲模式(沒有配置nodelay);如果桶滿了,則新進入的請求被限流;如果沒有滿則請求會以固定平均速率被處理(按照固定速率並根據需要延遲處理請求,延遲使用休眠實現);

2.3、如果配置了桶容量(burst>0)且非延遲模式(配置了nodelay);不會按照固定速率處理請求,而是允許突發處理請求;如果桶滿了,則請求被限流,直接返回相應的錯誤碼;

3、如果沒有被限流,則正常處理請求;

4、nginx會在相應時機進行選擇一些(3個節點)限流key進行過期處理,進行記憶體**。

測試工具測試結果:

配置zone\burst\nodelay的情況下,20r/1s測試結果為3個,理論上應該是2個成功,但是由於計算演算法問題,首次會出現3個,不過可以忽略不計。其它則返回503錯誤

Nginx限流設定

hello world成功的必經之路!1.限流演算法 1 令牌限流 演算法思想是 令牌以固定速率產生,並快取到令牌桶中 令牌桶放滿時,多餘的令牌被丟棄 請求要消耗等比例的令牌才能被處理 令牌不夠時,請求被快取。2 漏桶演算法 演算法思想是 水 請求 從上方倒入水桶,從水桶下方流出 被處理 來不及流出...

nginx 限流學習

在當今流量徒增的網際網路時代,很多業務場景都會涉及到高併發。這個時候介面進行限流是非常有必要的,而限流是nginx最有用的特性之一。一般情況下,首頁的併發量很大,即使應用了多級快取,使用者不停的重新整理 也是沒有必要的,甚至有些惡意的請求也會對系統造成影響。其作用可以防止使用者惡意刷爆 控制併發量。...

Nginx限流設定

nginx 提供兩種不同的限流方式,分別為ngx http limit req module,ngx http limit conn module,兩個模組可以搭配使用,其中ngx http limit req module用來限制請求次數,ngx http limit conn module限制併...