一文搞懂Nginx限流 簡單實現

2021-09-25 05:01:40 字數 1862 閱讀 3066

nginx現在已經是最火的負載均衡之一,在流量陡增的網際網路面前,介面限流也是很有必要的,尤其是針對高併發的場景。nginx的限流主要是兩種方式:限制訪問頻率和限制併發連線數。

限流(rate limiting)是nginx眾多特性中最有用的,也是經常容易被誤解和錯誤配置的,特性之一。該特性可以限制某個使用者在乙個給定時間段內能夠產生的http請求數。請求可以簡單到就是乙個對於主頁的get請求或者乙個登陸**的post請求。

限流也可以用於安全目的上,比如減慢暴力密碼破解攻擊。通過限制進來的請求速率,並且(結合日誌)標記出目標urls來幫助防範ddos攻擊。一般地說,限流是用在保護上游應用伺服器不被在同一時刻的大量使用者請求湮沒。

nginx限流是如何工作的

nginx限流使用漏桶演算法(leaky bucket algorithm),該演算法廣泛應用於通訊和基於包交換計算機網路中,用來處理當頻寬被限制時的突發情況。和乙個從上面進水,從下面漏水的桶的原理很相似;如果進水的速率大於漏水的速率,這個桶就會發生溢位。

在請求處理過程中,水代表從客戶端來的請求,而桶代表了乙個佇列,請求在該佇列中依據先進先出(fifo)演算法等待被處理。漏的水代表請求離開緩衝區並被伺服器處理,溢位代表了請求被丟棄並且永不被服務。

一、限制訪問頻率(正常流量)

nginx中我們使用ngx_http_limit_req_module模組來限制請求的訪問頻率,基於漏桶演算法原理實現。接下來我們使用 nginx limit_req_zone 和 limit_req 兩個指令,限制單個ip的請求處理速率。

語法:limit_req_zone key zone rate

二、限制訪問頻率(突發流量)

按上面的配置在流量突然增大時,超出的請求將被拒絕,無法處理突發流量,那麼在處理突發流量的時候,該怎麼處理呢?nginx提供了 burst 引數來解決突發流量的問題,並結合 nodelay 引數一起使用。burst 譯為突發、爆發,表示在超過設定的處理速率後能額外處理的請求數。

burst=20 nodelay表示這20個請求立馬處理,不能延遲,相當於特事特辦。不過,即使這20個突發請求立馬處理結束,後續來了請求也不會立馬處理。burst=20 相當於快取佇列中佔了20個坑,即使請求被處理了,這20個位置這只能按 100ms乙個來釋放。這就達到了速率穩定,但突然流量也能正常處理的效果。

三、限制併發連線數

nginx 的ngx_http_limit_conn_module模組提供了對資源連線數進行限制的功能,使用 limit_conn_zone 和 limit_conn 兩個指令就可以了。

limit_conn perip 20:對應的key是 $binary_remote_addr,表示限制單個ip同時最多能持有20個連線。 limit_conn perserver 100:對應的key是 $server_name,表示虛擬主機(server) 同時能處理併發連線的總數。注意,只有當 request header 被後端server處理後,這個連線才進行計數。

好了,以上幾種限流方式,你都清楚了嗎?

您可能感興趣的文章:

一文搞懂transform skew

目錄 如何理解斜切 skew,先看乙個 demo。在下面的 demo 中,有 4 個正方形,分別是 紅色 不做 skew 變換,綠色 x 方向變換,藍色 y 方向變換,黑色 兩個方向都變換,拖動下面的滑塊可以檢視改變 skew 角度後的效果。切換 selector 可以設定 transform or...

一文搞懂property函式

接下來我帶大家了解乙個函式的作用以及使用技巧,希望對大家都有幫助,話不多說,接下來就開始我的表演特性 首先property有兩種用法,一種是作為函式的用法,一種是作為裝飾器的用法,接下來我們就逐一分析 property函式 看一下作為函式它包含的引數都有哪些 property fget none,f...

一文搞懂記憶體屏障

gcc編譯選項中有個 o選項,表示編譯 的時候進行優化。這樣就會出現一種可能 優化後的 和優化前的 順序不一致。來看個例子 8 include9 10 int a,b 11 12 int main 13 很簡單,我們使用不加優化選項來將其編譯為組合語言 yuhao laplace workspace...