最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

nginx?流控使用的項目實踐

 更新時間:2024年03月21日 11:12:44   作者:liulanba  
本文主要介紹了nginx?流控使用的項目實踐

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

流量限制”配置兩個主要的指令,limit_req_zone和limit_req,如下所示:

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
server {
    location /login/ {
        limit_req zone=mylimit;

        proxy_pass http://my_upstream;
    }
}

limit_req_zone指令定義了流量限制相關(guān)的參數(shù),而limit_req指令在出現(xiàn)的上下文中啟用流量限制(示例中,對于”/login/”的所有請求)。limit_req_zone指令通常在 HTTP 塊中定義,使其可在多個上下文中使用,它需要以下三個參數(shù):

1)Key - 定義應(yīng)用限制的請求特性。示例中的 Nginx 變量remote_addr,占用更少的空間)
2)Zone - 定義用于存儲每個 IP 地址狀態(tài)以及被限制請求 URL 訪問頻率的共享內(nèi)存區(qū)域。保存在內(nèi)存共享區(qū)域的信息,意味著可以在 Nginx 的 worker 進(jìn)程之間共享。定義分為兩個部分:通過zone=keyword標(biāo)識區(qū)域的名字,以及冒號后面跟區(qū)域大小。16000 個 IP 地址的狀態(tài)信息,大約需要 1MB,所以示例中區(qū)域可以存儲 160000 個 IP 地址。
3)Rate - 定義最大請求速率。在示例中,速率不能超過每秒 10 個請求。Nginx 實際上以毫秒的粒度來跟蹤請求,所以速率限制相當(dāng)于每 100 毫秒 1 個請求。因為不允許”突發(fā)情況”,這意味著在前一個請求 100 毫秒內(nèi)到達(dá)的請求將被拒絕。

當(dāng) Nginx 需要添加新條目時存儲空間不足,將會刪除舊條目。如果釋放的空間仍不夠容納新記錄,Nginx 將會返回 503狀態(tài)碼(Service Temporarily Unavailable)。另外,為了防止內(nèi)存被耗盡,Nginx 每次創(chuàng)建新條目時,最多刪除兩條 60 秒內(nèi)未使用的條目。

limit_req_zone指令設(shè)置流量限制和共享內(nèi)存區(qū)域的參數(shù),但實際上并不限制請求速率。所以需要通過添加limit_req指令,將流量限制應(yīng)用在特定的 location 或者 server 塊。在上面示例中,我們對/login/請求進(jìn)行流量限制。
現(xiàn)在每個 IP 地址被限制為每秒只能請求 10 次 /login/,更準(zhǔn)確地說,在前一個請求的 100 毫秒內(nèi)不能請求該 URL。

突發(fā)限制訪問頻率(突發(fā)流量)

如果我們在 100 毫秒內(nèi)接收到 2 個請求,怎么辦?對于第二個請求,Nginx 將給客戶端返回狀態(tài)碼 503。這可能并不是我們想要的結(jié)果,因為應(yīng)用本質(zhì)上趨向于突發(fā)性。相反地,我們希望緩沖任何超額的請求,然后及時地處理它們。我們更新下配置,在limit_req中使用 burst 參數(shù):

location /login/ {
    limit_req zone=mylimit burst=20;
    proxy_pass http://my_upstream;
}

burst 參數(shù)定義了超出 zone 指定速率的情況下(示例中的 mylimit 區(qū)域,速率限制在每秒 10 個請求,或每 100 毫秒一個請求),客戶端還能發(fā)起多少請求。上一個請求 100 毫秒內(nèi)到達(dá)的請求將會被放入隊列,我們將隊列大小設(shè)置為 20。

這意味著,如果從一個給定 IP 地址發(fā)送 21 個請求,Nginx 會立即將第一個請求發(fā)送到上游服務(wù)器群,然后將余下 20 個請求放在隊列中。然后每 100 毫秒轉(zhuǎn)發(fā)一個排隊的請求,只有當(dāng)傳入請求使隊列中排隊的請求數(shù)超過 20 時,Nginx 才會向客戶端返回 503。

無延遲的排隊
配置 burst 參數(shù)將會使通訊更流暢,但是可能會不太實用,因為該配置會使站點看起來很慢。在上面的示例中,隊列中的第 20 個包需要等待 2 秒才能被轉(zhuǎn)發(fā),此時返回給客戶端的響應(yīng)可能不再有用。要解決這個情況,可以在 burst 參數(shù)后添加 nodelay 參數(shù):

location /login/ {
    limit_req zone=mylimit burst=20 nodelay;

    proxy_pass http://my_upstream;
}

使用 nodelay 參數(shù),Nginx 仍將根據(jù) burst 參數(shù)分配隊列中的位置,并應(yīng)用已配置的速率限制,而不是清理隊列中等待轉(zhuǎn)發(fā)的請求。相反地,當(dāng)一個請求到達(dá)“太早”時,只要在隊列中能分配位置,Nginx 將立即轉(zhuǎn)發(fā)這個請求。將隊列中的該位置標(biāo)記為”taken”(占據(jù)),并且不會被釋放以供另一個請求使用,直到一段時間后才會被釋放(在這個示例中是,100 毫秒后)。

假設(shè)如前所述,隊列中有 20 個空位,從給定的 IP 地址發(fā)出的 21 個請求同時到達(dá)。Ngin x會立即轉(zhuǎn)發(fā)這個 21 個請求,并且標(biāo)記隊列中占據(jù)的 20 個位置,然后每 100 毫秒釋放一個位置。如果是25個請求同時到達(dá),Nginx 將會立即轉(zhuǎn)發(fā)其中的 21 個請求,標(biāo)記隊列中占據(jù)的 20 個位置,并且返回 503 狀態(tài)碼來拒絕剩下的 4 個請求。

現(xiàn)在假設(shè),第一組請求被轉(zhuǎn)發(fā)后 101 毫秒,另 20 個請求同時到達(dá)。隊列中只會有一個位置被釋放,所以 Nginx 轉(zhuǎn)發(fā)一個請求并返回503狀態(tài)碼來拒絕其他 19 個請求。如果在 20 個新請求到達(dá)之前已經(jīng)過去了 501 毫秒,5 個位置被釋放,所以 Nginx 立即轉(zhuǎn)發(fā) 5 個請求并拒絕另外 15 個。

效果相當(dāng)于每秒 10 個請求的“流量限制”。如果希望不限制兩個請求間允許間隔的情況下實施“流量限制”,nodelay 參數(shù)是很實用的。

注意:對于大部分部署,我們建議使用 burst 和 nodelay 參數(shù)來配置limit_req指令。

限制并發(fā)連接數(shù)

Nginx 的ngx_http_limit_conn_module模塊提供了對資源連接數(shù)進(jìn)行限制的功能,使用 limit_conn_zone 和 limit_conn 兩個指令就可以了。
properties復(fù)制代碼limit_conn perip 20 : 對應(yīng)的key是 $binary_remote_addr,表示限制單個IP同時最多能持有20個連接。

limit_conn perserver 100 : 對應(yīng)的key是 $server_name,表示虛擬主機(jī)(server) 同時能處理并發(fā)連接的總數(shù)。注意,只有當(dāng) request header 被后端server處理后,這個連接才進(jìn)行計數(shù)。

修改nginx.conf配置,如下:

#速率限流配置
limit_req_zone $binary_remote_addr zone=ipRateLimit:10m rate=2r/s;
#并發(fā)量限流-單個IP控制
limit_conn_zone $binary_remote_addr zone=perip:10m;
#并發(fā)量限流-整個服務(wù)控制
limit_conn_zone $server_name zone=perserver:10m;
server {
    listen       80;
    server_name  localhost;
    location ~ .*\.(woff|ico|css|js|gif|jpg|jpeg|png)$ {
    	root /usr/local/openrestyDir/pages/;
    }
    location /msitems/ {
        #限流配置
        #limit_req zone=ipRateLimit burst=5 nodelay;
        #并發(fā)量限流
        limit_conn perip 10;
        limit_conn perserver 100;
        root /usr/local/openrestyDir/pages/;
    }
}

上面配置了單個IP同時并發(fā)連接數(shù)最多只能10個連接,并且設(shè)置了整個虛擬服務(wù)器同時最大并發(fā)數(shù)最多只能100個鏈接。當(dāng)然,只有當(dāng)請求的header被服務(wù)器處理后,虛擬服務(wù)器的連接數(shù)才會計數(shù)。剛才有提到過Nginx是基于漏桶算法原理實現(xiàn)的,實際上限流一般都是基于漏桶算法和令牌桶算法實現(xiàn)的。接下來我們來看看兩個算法的介紹:

漏桶算法
漏桶算法是網(wǎng)絡(luò)世界中流量整形或速率限制時經(jīng)常使用的一種算法,它的主要目的是控制數(shù)據(jù)注入到網(wǎng)絡(luò)的速率,平滑網(wǎng)絡(luò)上的突發(fā)流量。漏桶算法提供了一種機(jī)制,通過它,突發(fā)流量可以被整形以便為網(wǎng)絡(luò)提供一個穩(wěn)定的流量。也就是我們剛才所講的情況。漏桶算法提供的機(jī)制實際上就是剛才的案例:突發(fā)流量會進(jìn)入到一個漏桶,漏桶會按照我們定義的速率依次處理請求,如果水流過大也就是突發(fā)流量過大就會直接溢出,則多余的請求會被拒絕。所以漏桶算法能控制數(shù)據(jù)的傳輸速率。

令牌桶算法
令牌桶算法是網(wǎng)絡(luò)流量整形和速率限制中最常使用的一種算法。典型情況下,令牌桶算法用來控制發(fā)送到網(wǎng)絡(luò)上的數(shù)據(jù)的數(shù)目,并允許突發(fā)數(shù)據(jù)的發(fā)送。Google開源項目Guava中的RateLimiter使用的就是令牌桶控制算法。令牌桶算法的機(jī)制如下:存在一個大小固定的令牌桶,會以恒定的速率源源不斷產(chǎn)生令牌。如果令牌消耗速率小于生產(chǎn)令牌的速度,令牌就會一直產(chǎn)生直至裝滿整個令牌桶。

黑白名單

有時候會有一些惡意IP攻擊服務(wù)器,會基于程序頻繁發(fā)起請求對服務(wù)器造成巨大壓力,我們此時可以使用Nginx的黑名單功能實現(xiàn)黑名單過濾操作。我們首先需要配置黑名單IP,黑名單IP我們可以記錄到一個配置文件中,比如配置到blockip.conf文件中:
配置固定IP為黑名單:

deny 192.168.100.1;

在nginx.conf中引入blockip.conf,可以放到http, server, location語句塊,配置如下:

#黑名單
include blockip.conf;

此時在192.168.100.1的IP上訪問服務(wù)器,會報403錯誤

屏蔽ip的配置文件既可以屏蔽單個ip,也可以屏蔽ip段,或者只允許某個ip或者某個ip段訪問。

# 屏蔽單個ip訪問
deny IP;
# 允許單個ip訪問
allow IP;
# 屏蔽所有ip訪問
deny all;
# 允許所有ip訪問
allow all;
#屏蔽整個段即從123.0.0.1到123.255.255.254訪問的命令
deny 123.0.0.0/8
#屏蔽IP段即從123.45.0.1到123.45.255.254訪問的命令
deny 124.45.0.0/16
#屏蔽IP段即從123.45.6.1到123.45.6.254訪問的命令
deny 123.45.6.0/24

如果你想實現(xiàn)這樣的應(yīng)用,除了幾個IP外,其他全部拒絕,那需要你在blockip.conf中這樣寫:

allow 192.168.100.1;
allow 192.168.100.2;
deny all;

但是這種手動配置的方式可能太過繁瑣,我們也可以配置動態(tài)黑白名單。
配置動態(tài)黑白名單,我們可以采用Lua+Redis實現(xiàn),將黑名單存入到Redis緩存,每次執(zhí)行請求時,通過lua腳本先獲取用戶IP,匹配IP是否屬于黑名單,如果是,則不讓請求,如果不是,則放行。

參考鏈接:

https://juejin.cn/post/7120044094239277070

https://cloud.tencent.com/developer/article/1912141

到此這篇關(guān)于nginx 流控使用的項目實踐的文章就介紹到這了,更多相關(guān)nginx 流控內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Nginx之proxy_redirect使用詳解

    Nginx之proxy_redirect使用詳解

    這篇文章主要介紹了Nginx之proxy_redirect使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • Nginx反向代理如何到訪問者機(jī)器上(后端調(diào)試)

    Nginx反向代理如何到訪問者機(jī)器上(后端調(diào)試)

    這篇文章主要介紹了Nginx反向代理如何到訪問者機(jī)器上(后端調(diào)試),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 詳解Nginx服務(wù)器的配置中開啟文件Gzip壓縮的方法

    詳解Nginx服務(wù)器的配置中開啟文件Gzip壓縮的方法

    這篇文章主要介紹了Nginx服務(wù)器的配置中開啟文件Gzip壓縮的方法,可以對CSS和JavaScript以及各種圖片等web傳輸?shù)奈募M(jìn)行壓縮,需要的朋友可以參考下
    2016-01-01
  • Nginx中配置使用非默認(rèn)80端口進(jìn)行服務(wù)的完整指南

    Nginx中配置使用非默認(rèn)80端口進(jìn)行服務(wù)的完整指南

    在實際生產(chǎn)環(huán)境中,我們經(jīng)常需要將Nginx配置在其他端口上運(yùn)行,本文將詳細(xì)介紹如何在Nginx中配置使用非默認(rèn)端口進(jìn)行服務(wù),希望對大家有所幫助
    2025-08-08
  • OpenResty中實現(xiàn)按QPS、時間范圍、來源IP進(jìn)行限流的方法

    OpenResty中實現(xiàn)按QPS、時間范圍、來源IP進(jìn)行限流的方法

    OpenResty是一個基于Nginx與Lua的高性能Web平臺,它通過LuaJIT在Nginx中運(yùn)行高效的Lua腳本和模塊,可以用來處理復(fù)雜的網(wǎng)絡(luò)請求,并且支持各種流量控制和限制的功能,這篇文章主要介紹了OpenResty中實現(xiàn)按QPS、時間范圍、來源IP進(jìn)行限流,需要的朋友可以參考下
    2024-02-02
  • CentOS 7下編譯安裝Nginx 1.11.10教程

    CentOS 7下編譯安裝Nginx 1.11.10教程

    這篇文章主要介紹了在CentOS 7下編譯安裝Nginx 1.11.10的方法,文中給出了詳細(xì)的安裝步驟,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-03-03
  • Nginx設(shè)置日志打印post請求參數(shù)的方法

    Nginx設(shè)置日志打印post請求參數(shù)的方法

    這篇文章主要介紹了Nginx設(shè)置日志打印post請求參數(shù)的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Nginx常用配置以及代理轉(zhuǎn)發(fā)操作詳解

    Nginx常用配置以及代理轉(zhuǎn)發(fā)操作詳解

    這篇文章主要給大家介紹了關(guān)于Nginx常用配置以及代理轉(zhuǎn)發(fā)的相關(guān)資料,nginx一般被用來做反向代理,將請求轉(zhuǎn)發(fā)到應(yīng)用服務(wù)器上,比如tomcat的應(yīng)用,需要的朋友可以參考下
    2023-09-09
  • nginx配置之部署后刷新產(chǎn)生404錯誤的解決

    nginx配置之部署后刷新產(chǎn)生404錯誤的解決

    文章總結(jié):在前端部署過程中遇到瀏覽器刷新出現(xiàn)nginx_error的問題,通過配置nginx.conf文件中的try_files指令來解決,針對單頁面應(yīng)用的邏輯問題,確保登錄頁面的邏輯正確處理會話存儲中的token,以避免頁面刷新后回到登錄頁面的情況
    2026-02-02
  • 詳解Nginx中的Rewrite的重定向配置與實踐

    詳解Nginx中的Rewrite的重定向配置與實踐

    這篇文章主要介紹了詳解Nginx中的Rewrite的重定向配置與實踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03

最新評論

鄢陵县| 东乌珠穆沁旗| 津市市| 涞水县| 中宁县| 秦皇岛市| 阿尔山市| 腾冲县| 习水县| 镇康县| 康保县| 漳浦县| 邳州市| 高清| 准格尔旗| 龙井市| 上虞市| 云霄县| 康乐县| 广东省| 永定县| 会东县| 洪雅县| 阜城县| 景宁| 都匀市| 龙江县| 呼伦贝尔市| 梅州市| 平乐县| 政和县| 拉萨市| 健康| 浦县| 华坪县| 彭水| 沿河| 临江市| 永靖县| 麦盖提县| 建阳市|