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

Nginx限流配置詳解

 更新時間:2023年11月28日 08:24:13   作者:吳聲子夜歌  
限流是服務(wù)降級的一種方式,通過限制系統(tǒng)的輸入和輸出流量以達到保護系統(tǒng)的目的,本文主要介紹了Nginx限流配置詳解,感興趣的可以了解一下

1、概述

限流(Rate Limitting)是服務(wù)降級的一種方式,通過限制系統(tǒng)的輸入和輸出流量以達到保護系統(tǒng)的目的。比如我們的網(wǎng)站暴露在公網(wǎng)環(huán)境中,除了用戶的正常訪問,網(wǎng)絡(luò)爬蟲、惡意攻擊或者大促等突發(fā)流量都可能都會對系統(tǒng)造成壓力,如果這種壓力超出了服務(wù)器的處理能力,會造成響應(yīng)過慢甚至系統(tǒng)崩潰的問題。因此,當并發(fā)請求數(shù)過大時,我們通過限制一部分請求(比如限制同一IP的頻繁請求)來保證服務(wù)器可以正確響應(yīng)另一部分的請求。

nginx 提供了兩種限流方式,一種是限制請求速率,一種是限制連接數(shù)量。

另外還提供了對下載/上傳速度的限制。

2、限制請求速率

nginx 的 ngx_http_limit_req_module 模塊提供限制請求處理速率的能力,使用了漏桶算法(leaky bucket algorithm)。我們可以想像有一只上面進水、下面勻速出水的桶,如果桶里面有水,那剛進去的水就要存在桶里等下面的水流完之后才會流出,如果進水的速度大于水流出的速度,桶里的水就會滿,這時水就不會進到桶里,而是直接從桶的上面溢出。對應(yīng)到處理網(wǎng)絡(luò)請求,水代表從客戶端來的請求,而桶代表一個隊列,請求在該隊列中依據(jù)先進先出(FIFO)算法等待被處理。漏的水代表請求離開緩沖區(qū)并被服務(wù)器處理,溢出代表了請求被丟棄并且永不被服務(wù)。

在這里插入圖片描述

2.1、正常限流

nginx 中有兩個主要的指令可以用來配置限流:limit_req_zone 和 limit_req。

下面是一個最簡單的限流的例子:

limit_req_zone $binary_remote_addr zone=test:10m rate=2r/s;

server {
    location / {
        limit_req zone=test;
    }
} 

imit_req_zone 用于設(shè)置限流和共享內(nèi)存區(qū)域的參數(shù),格式為:limit_req_zone key zone rate。

  • key:定義限流對象,$binary_remote_addr 是 nginx 中的變量,表示基于 remote_addr(客戶端IP) 來做限流,binary_ 是二進制存儲。使用 $binary_remote_addr 而不是 $remote_addr 是因為二進制存儲可以壓縮內(nèi)存占用量。 $remote_addr 變量的大小從7到15個字節(jié)不等,而 $binary_remote_addr變量的大小對于 IPv4 始終為4個字節(jié),對于 IPv6 地址則為16個字節(jié)。
  • zone:定義共享內(nèi)存區(qū)來存儲訪問信息,訪問信息包括每個 IP 地址狀態(tài)和訪問受限請求 URL 的頻率等。zone 的定義又分為兩個部分:由 zone= 關(guān)鍵字標識的區(qū)域名稱,以及冒號后面的區(qū)域大小。test:10m 表示一個大小為10M,名字為 test 的內(nèi)存區(qū)域。1M 能存儲16000個 IP 地址的訪問信息,test 大概可以存儲約160000個地址。nginx 創(chuàng)建新記錄的時候,會移除前60秒內(nèi)沒有被使用的記錄,如果釋放的空間還是存儲不了新的記錄,會返回503的狀態(tài)碼。
  • rate:設(shè)置最大的訪問速率。rate=2r/s(為了好模擬,rate 設(shè)置的值比較小),表示每秒最多處理 2個請求。事實上 nginx 是以毫秒為粒度追蹤請求的,rate=2r/s 實際上是每500毫秒1個請求,也就是說,上一個請求完成后,如果500毫秒內(nèi)還有請求到達,這些請求會被拒絕(默認返回503,如果想修改返回值,可以設(shè)置limit_req_status)。

limit_req_zone 只是設(shè)置限流參數(shù),如果要生效的話,必須和 limit_req 配合使用。limit_req 的格式為:limit_req zone=name [burst=number] [nodelay]

上面的例子只簡單指定了 zone=test,表示使用 test 這個區(qū)域的配置,在請求 html 文件時進行限流。我們可以理解為這個桶目前沒有任何儲存水滴的能力,到達的所有不能立即漏出的請求都會被拒絕。如果我1秒內(nèi)發(fā)送了10次請求,其中前500毫秒1次,后500毫秒9次,那么只有前500毫秒的請求和后500毫秒的第一次請求會響應(yīng),其余請求都會被拒絕。

在這里插入圖片描述

2.2、處理突發(fā)流量

上面的配置保證了 nginx 以固定的速度提供服務(wù)(2r/s),但是這種情況不適用于有突發(fā)流量的情況,我們希望可以盡可能的緩存請求并處理它們,此時需要在 limit_req 上增加 burst 參數(shù):

limit_req_zone $binary_remote_addr zone=test:10m rate=2r/s;

server {
    location / {
        limit_req zone=test burst=5;
    }
} 

burst 表示在超過設(shè)定的訪問速率后能額外處理的請求數(shù)。當 rate=2r/s 時,表示每500ms 可以處理一個請求。burst=5時,如果同時有10個請求到達,nginx 會處理第1個請求,剩余9個請求中,會有5個被放入隊列,剩余的4個請求會直接被拒絕。然后每隔500ms從隊列中獲取一個請求進行處理,此時如果后面繼續(xù)有請求進來,如果隊列中的請求數(shù)目超過了5,會被拒絕,不足5的時候會添加到隊列中進行等待。我們可以理解為現(xiàn)在的桶可以存5滴水:

在這里插入圖片描述

配置 burst 之后,雖然同時到達的請求不會全部被拒絕,但是仍需要等待500ms 一次的處理時間,放入桶中的第5個請求需要等待500ms * 4的時間才能被處理,更長的等待時間意味著用戶的流失,在許多場景下,這個等待時間是不可接受的。此時我們需要增加 nodelay 參數(shù),和 burst 配合使用。

limit_req_zone $binary_remote_addr zone=test:10m rate=2r/s;

server {
    location / {
        limit_req zone=test burst=5 nodelay;
    }
} 

nodelay 表示不延遲。設(shè)置 nodelay 后,第一個到達的請求和隊列中的請求會立即進行處理,不會出現(xiàn)等待的請求。

在這里插入圖片描述

需要注意的是,雖然隊列中的5個請求立即被處理了,但是隊列中的位置依舊是按照500ms 的速度依次被釋放的。后面的4個請求依舊是被拒絕的,長期來看并不會提高吞吐量的上限,長期吞吐量的上限是由設(shè)置的 rate 決定的。

2.3、設(shè)置白名單

如果遇到不需要限流的情況,比如測試要壓測,可以通過配置白名單,取消限流的設(shè)置。白名單要用到 nginx 的 ngx_http_geo_module 和 ngx_http_map_module 模塊。

geo $limit {
    default 1;
    10.0.0.0/8 0;
    192.168.0.0/24 0;
}

map $limit $limit_key {
    0 "";
    1 $binary_remote_addr;
}

limit_req_zone $limit_key zone=mylimit:10m rate=2r/s;

geo 指令可以根據(jù) IP 創(chuàng)建變量 $limit。$limit 的默認值是1,如果匹配到了下面的 IP,則返回對應(yīng)的值(這里返回的是0)。

之后通過 map 指令,將 $limit 的值映射為$limit_key:在白名單內(nèi)的,$limit_key 為空字符串,不在白名單內(nèi)的,則為 $binary_remote_addr。當limit_req_zone指令的第一個參數(shù)是一個空字符串,限制不起作用,因此白名單的 IP 地址(在10.0.0.0/8和192.168.0.0/24子網(wǎng)中)沒有被限制,其它 IP 地址都被限制為 2r/s

2.4、limit_req重復(fù)

如果同一個 location 下配置了多條 limit_req 的指令,這些指令所定義的限制都會被使用。

geo $limit {
    default 1;
    10.0.0.0/8 0;
    192.168.0.0/24 0;
}

map $limit $limit_key {
    0 "";
    1 $binary_remote_addr;
}

limit_req_zone $limit_key zone=mylimit:10m rate=2r/s;
limit_req_zone $binary_remote_addr zone=myLimit2:10m rate=10r/s;
server {
    location ~* \.(html)$ {
        limit_req zone=mylimit burst=5 nodelay;
        limit_req zone=myLimit2 burst=5 nodelay;
    }
} 

上面的例子配置了兩條規(guī)則,myLimit 和 myLimit2。白名單用戶雖然沒有匹配到mylimit的規(guī)則,但是根據(jù)規(guī)則 mylimit2,被限制為10r/s。對于不在白名單的用戶,則需要同時匹配mylimit 和 mylimit2,兩者中最嚴格的條件 2r/s 會起作用。

3、限制連接數(shù)

nginx 的 ngx_http_limit_conn_module 模塊提供限制連接數(shù)的能力,包含兩個指令limit_conn_zone 和 limit_conn,格式為limit_conn_zone key zone。

limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server {
    location ~* \.(html)$ {
        limit_conn perip 10;
        limit_conn perserver 100;
    }
} 

limit_conn perip 10:key 是 $binary_remote_addr,表示限制單個IP同時最多能持有10個連接。
limit_conn perserver 100: key 是 $server_name,表示虛擬主機(server) 同時能處理并發(fā)連接的總數(shù)為100。
需要注意的是:只有當 request header 被后端server處理后,這個連接才進行計數(shù)。

4、上傳/下載速率限制

limit_rate主要用于限制用戶和服務(wù)器之間傳輸?shù)淖止?jié)數(shù),最常用的場景可能就是下載/上傳限速。limit_rate并沒有單獨的一個模塊,而是在ngx_http_core_module中,同時它的相關(guān)指令也比較少,只有limit_ratelimit_rate_after這兩個指令。

4.1、limit_rate

server {
    location / {
       	limit_rate 4k;
    }
} 
  • limit_rate的用法非常簡單,后面跟隨的rate就是具體限速的閾值
  • 注意默認的單位是bytes/s,也就是每秒傳輸?shù)淖止?jié)數(shù)Bytes而不是比特數(shù)bits
  • rate可以設(shè)置為變量,從而可以實現(xiàn)動態(tài)限速
  • 限速指令的生效范圍是根據(jù)每個連接確定的,例如上面限定每個連接的速率為4k,也就是當客戶端發(fā)起兩個連接的時候,速率就可以變?yōu)?k

4.2、limit_rate_after

server {
    location / {
    	limit_rate_after 500k;
       	limit_rate 4k;
    }
} 

limit_rate_after允許在傳輸了一部分數(shù)據(jù)之后再進行限速,例如上面的配置中就是傳輸?shù)那?00k數(shù)據(jù)不限速,500k之后再進行限速。比較常見的應(yīng)用場景如分段下載限速,超過指定大小的部分再進行限速;又或者是流媒體視頻網(wǎng)站一般為了保證用戶體驗而不會對第一個畫面進行限速,確保其能夠盡快加載出來,等用戶開始觀看視頻之后,再把帶寬限制在合理的范圍內(nèi),從而降低因客戶端網(wǎng)速過快導(dǎo)致提前加載過多內(nèi)容帶來的額外成本。

4.3、proxy_limit_rate

proxy_limit_rate的基本原理和用法與limit_rate幾乎一樣,唯一不同的是proxy_limit_rate是限制nginx和后端upstream服務(wù)器之間的連接速率而limit_rate限制的是nginx和客戶端之間的連接速率。需要注意的是proxy_limit_rate需要開啟了proxy_buffering這個指令才會生效。

#語法:
Syntax: proxy_limit_rate rate;
Default:    proxy_limit_rate 0;
Context:    http, server, location
This directive appeared in version 1.7.7.

4.4、動態(tài)限速

limit_rate的一大特點就是能夠使用變量,這就意味著和map指令之類的進行組合就可以實現(xiàn)動態(tài)限速功能,這里只列幾個簡單的示范

4.4.1、基于時間動態(tài)限速

這里引入了nginx內(nèi)置的一個ssi模塊,這個模塊有兩個比較有意思的時間變量:$date_local$date_gmt,分別對應(yīng)當前時間和GMT時間

這里使用變量和map指令組合的方式,利用正則表達式匹配不同的時間段,再結(jié)合map變量將不同時間段和不同的限速對應(yīng)起來。

 map $date_local $limit_rate_time {
     default 4K;
     ~(00:|01:|02:|03:|04:|05:|06:|07:).*:.* 16K;
     ~(08:|12:|13:|18:).*:.* 8K;
     ~(19:|20:|21:|22:|23:).*:.* 16K;
 }
 ?
 limit_rate $limit_rate_time

4.4.2、基于變量動態(tài)限速

有些服務(wù)可能會對不用的用戶進行不同的限速,例如VIP用戶的速度要更快一些等,例如下面可以針對不同的cookie進行限速

 map $cookie_User $limit_rate_cookie {
     gold 64K;
     silver 32K;
     copper 16K;
     iron 8K;
 }
 ?
 limit_rate $limit_rate_cookie

到此這篇關(guān)于Nginx限流配置詳解的文章就介紹到這了,更多相關(guān)Nginx限流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • nginx cache不緩存問題的原因與解決方案

    nginx cache不緩存問題的原因與解決方案

    最近在工作中遇到了一個問題,發(fā)現(xiàn)nginx cache居然不緩存,后來通過查找網(wǎng)上的資料找到了原因和解決方案,下面整理好分享給大家,同樣遇到這個問題的朋友們可以參考借鑒,下面和小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2016-10-10
  • 把ImageMagic庫編譯進nginx服務(wù)器的一些必要配置

    把ImageMagic庫編譯進nginx服務(wù)器的一些必要配置

    這篇文章主要介紹了把ImageMagic庫編譯進nginx服務(wù)器的一些必要配置,本文給出了操作步驟和配置參數(shù)示例,需要的朋友可以參考下
    2015-06-06
  • nginx?反向代理負載均衡策略配置SSL訪問匹配規(guī)則優(yōu)先級

    nginx?反向代理負載均衡策略配置SSL訪問匹配規(guī)則優(yōu)先級

    本文主要包含1.Nginx配置文件詳解2.Nginx實現(xiàn)負載均衡3.Nginx前端項目部署4.Nginx配置SSL訪問5.nginx匹配規(guī)則說明以及匹配的優(yōu)先級的內(nèi)容詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • nginx完全卸載的方法步驟

    nginx完全卸載的方法步驟

    由于現(xiàn)在nginx有版本漏洞,所以很多安裝過nginx的需要卸載重新安裝,本文主要介紹了nginx完全卸載的方法步驟,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08
  • nginx如何配置同一個端口轉(zhuǎn)發(fā)多個項目

    nginx如何配置同一個端口轉(zhuǎn)發(fā)多個項目

    這篇文章主要介紹了nginx如何配置同一個端口轉(zhuǎn)發(fā)多個項目問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Nginx安裝出現(xiàn)錯誤解決方案

    Nginx安裝出現(xiàn)錯誤解決方案

    這篇文章主要介紹了Nginx安裝出現(xiàn)錯誤解決方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • Nginx ssi合并頁面的具體實現(xiàn)

    Nginx ssi合并頁面的具體實現(xiàn)

    nginx的ssi模塊是一種類似于ASP的基于服務(wù)器的網(wǎng)頁制作技術(shù),本文主要介紹了Nginx ssi合并頁面的具體實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-05-05
  • Nginx配置支持ThinkPHP的PATH_INFO

    Nginx配置支持ThinkPHP的PATH_INFO

    這篇文章主要介紹了Nginx配置支持ThinkPHP的PATH_INFO,本文在Ubuntu的開發(fā)環(huán)境加配置成功,需要的朋友可以參考下
    2015-07-07
  • 深入探究Nginx體系化之虛擬主機分類及配置實現(xiàn)

    深入探究Nginx體系化之虛擬主機分類及配置實現(xiàn)

    Nginx,這款備受推崇的高性能 Web 服務(wù)器,以其強大的性能和靈活的配置而廣受歡迎,在實際應(yīng)用中,虛擬主機是一項重要的功能,允許我們在單個服務(wù)器上托管多個網(wǎng)站,本文將深入探討 Nginx 虛擬主機的分類和配置實現(xiàn),幫助您構(gòu)建一個高效多站點托管平臺
    2023-08-08
  • Nginx+uWSGI部署實踐

    Nginx+uWSGI部署實踐

    文章介紹了如何使用Nginx和uWSGI部署Django應(yīng)用,包括配置WSGI接口、安裝和配置uWSGI、關(guān)聯(lián)uWSGI和Nginx、配置靜態(tài)文件、轉(zhuǎn)交請求給其他地址以及實現(xiàn)負載均衡
    2025-12-12

最新評論

汾阳市| 贵德县| 武义县| 玉林市| 黔江区| 凌云县| 连山| 榆林市| 潼南县| 台东市| 疏附县| 泰和县| 铜川市| 台湾省| 通城县| 祁连县| 大石桥市| 镇平县| 北碚区| 洪雅县| 孟连| 兴城市| 徐水县| 息烽县| 章丘市| 奉化市| 康平县| 游戏| 大方县| 抚远县| 拉孜县| 扶余县| 十堰市| 平凉市| 广德县| 布尔津县| 彩票| 连州市| 楚雄市| 汾阳市| 包头市|