0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

淺入深講解Nginx限流相關(guān)配置

馬哥Linux運(yùn)維 ? 來源:cnblogs ? 2024-04-29 11:24 ? 次閱讀

本文以示例的形式,由淺入深講解Nginx限流相關(guān)配置,是對簡略的官方文檔的積極補(bǔ)充。

Nginx限流使用的是leaky bucket算法,如對算法感興趣,可移步維基百科先行閱讀。不過不了解此算法,不影響閱讀本文。

空桶

我們從最簡單的限流配置開始:

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

server {
    location /login/ {
        limit_req zone=ip_limit;
        proxy_pass http://login_upstream;
    }
}

$binary_remote_addr 針對客戶端ip限流;

zone=ip_limit:10m 限流規(guī)則名稱為ip_limit,允許使用10MB的內(nèi)存空間來記錄ip對應(yīng)的限流狀態(tài);

rate=10r/s 限流速度為每秒10次請求

location /login/ 對登錄進(jìn)行限流

限流速度為每秒10次請求,如果有10次請求同時(shí)到達(dá)一個(gè)空閑的nginx,他們都能得到執(zhí)行嗎?

fd91cb88-054e-11ef-a297-92fbcf53809c.png

漏桶漏出請求是勻速的。10r/s是怎樣勻速的呢?每100ms漏出一個(gè)請求。

在這樣的配置下,桶是空的,所有不能實(shí)時(shí)漏出的請求,都會(huì)被拒絕掉。

所以如果10次請求同時(shí)到達(dá),那么只有一個(gè)請求能夠得到執(zhí)行,其它的,都會(huì)被拒絕。

這不太友好,大部分業(yè)務(wù)場景下我們希望這10個(gè)請求都能得到執(zhí)行。

Burst

我們把配置改一下,解決上一節(jié)的問題

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

server {
    location /login/ {
        limit_req zone=ip_limit burst=12;
        proxy_pass http://login_upstream;
    }
}

burst=12 漏桶的大小設(shè)置為12

fda45f32-054e-11ef-a297-92fbcf53809c.png

邏輯上叫漏桶,實(shí)現(xiàn)起來是FIFO隊(duì)列,把得不到執(zhí)行的請求暫時(shí)緩存起來。

這樣漏出的速度仍然是100ms一個(gè)請求,但并發(fā)而來,暫時(shí)得不到執(zhí)行的請求,可以先緩存起來。只有當(dāng)隊(duì)列滿了的時(shí)候,才會(huì)拒絕接受新請求。

這樣漏桶在限流的同時(shí),也起到了削峰填谷的作用。

在這樣的配置下,如果有10次請求同時(shí)到達(dá),它們會(huì)依次執(zhí)行,每100ms執(zhí)行1個(gè)。

雖然得到執(zhí)行了,但因?yàn)榕抨?duì)執(zhí)行,延遲大大增加,在很多場景下仍然是不能接受的。

NoDelay

繼續(xù)修改配置,解決Delay太久導(dǎo)致延遲增加的問題

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

server {
    location /login/ {
        limit_req zone=ip_limit burst=12 nodelay;
        proxy_pass http://login_upstream;
    }
}

nodelay 把開始執(zhí)行請求的時(shí)間提前,以前是delay到從桶里漏出來才執(zhí)行,現(xiàn)在不delay了,只要入桶就開始執(zhí)行

fdb33a16-054e-11ef-a297-92fbcf53809c.png

要么立刻執(zhí)行,要么被拒絕,請求不會(huì)因?yàn)橄蘖鞫黾友舆t了。

因?yàn)檎埱髲耐袄锫┏鰜磉€是勻速的,桶的空間又是固定的,最終平均下來,還是每秒執(zhí)行了5次請求,限流的目的還是達(dá)到了。

但這樣也有缺點(diǎn),限流是限了,但是限得不那么勻速。以上面的配置舉例,如果有12個(gè)請求同時(shí)到達(dá),那么這12個(gè)請求都能夠立刻執(zhí)行,然后后面的請求只能勻速進(jìn)桶,100ms執(zhí)行1個(gè)。如果有一段時(shí)間沒有請求,桶空了,那么又可能出現(xiàn)并發(fā)的12個(gè)請求一起執(zhí)行。

大部分情況下,這種限流不勻速,不算是大問題。不過nginx也提供了一個(gè)參數(shù)才控制并發(fā)執(zhí)行也就是nodelay的請求的數(shù)量。

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

server {
    location /login/ {
        limit_req zone=ip_limit burst=12 delay=4;
        proxy_pass http://login_upstream;
    }
}

delay=4 從桶內(nèi)第5個(gè)請求開始delay

fdbc257c-054e-11ef-a297-92fbcf53809c.png

這樣通過控制delay參數(shù)的值,可以調(diào)整允許并發(fā)執(zhí)行的請求的數(shù)量,使得請求變的均勻起來,在有些耗資源的服務(wù)上控制這個(gè)數(shù)量,還是有必要的。

審核編輯:黃飛

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4552

    瀏覽量

    92024
  • nginx
    +關(guān)注

    關(guān)注

    0

    文章

    139

    瀏覽量

    12115

原文標(biāo)題:Nginx限速模塊大揭秘

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    的介紹BLE與MEMS中的開發(fā)板設(shè)計(jì)

    當(dāng)BLE遇到MEMS,就如同天使有了翅膀。本期從有的介紹BLE與MEMS的那些事,就從ST的STEVA
    的頭像 發(fā)表于 03-31 08:44 ?8991次閱讀

    Linux運(yùn)維Nginx軟件優(yōu)化之日志優(yōu)化

    1. 配置Nginx服務(wù)相關(guān)日志操作1) 進(jìn)行日志的切割[code][root@oldboy ~]# mkdir /server/scripts/ -p[root@oldboy ~]# cd
    發(fā)表于 12-18 15:17

    nginx中的sendfile配置說明

    nginx配置sendfile及詳細(xì)說明
    發(fā)表于 05-05 08:08

    Centos7Nginx安裝與配置步驟

    Centos7 Nginx安裝與配置,防火墻開啟端口監(jiān)聽
    發(fā)表于 06-02 12:58

    請問哪位大神可以詳細(xì)介紹JavaScript拷貝和拷貝?

    JavaScript數(shù)據(jù)類型JavaScript拷貝和拷貝
    發(fā)表于 11-05 07:16

    nginx錯(cuò)誤頁面配置

    16、nginx 錯(cuò)誤頁面配置nginx錯(cuò)誤頁面包括404 403 500 502 503 504等頁面,只需要在server中增加以下配置即可: error_page404 403
    發(fā)表于 07-26 06:54

    主要學(xué)習(xí)下nginx的安裝配置

    主要學(xué)習(xí)下nginx的安裝配置,以便于后續(xù)學(xué)習(xí)。以下在本地虛擬機(jī)上搭建學(xué)習(xí)。1、檢查系統(tǒng)網(wǎng)絡(luò)是否能連通公網(wǎng):ping www.taobao.com2、確認(rèn)yum源是否配置好,用于下載安裝環(huán)境基礎(chǔ)包
    發(fā)表于 10-19 14:12

    RF工程師必須掌握的內(nèi)容:從解說S參數(shù)

    RF工程師必須掌握的內(nèi)容:從解說S參數(shù)。
    的頭像 發(fā)表于 03-01 10:34 ?1.1w次閱讀
    RF工程師必須掌握的內(nèi)容:從<b class='flag-5'>淺</b><b class='flag-5'>入</b><b class='flag-5'>深</b>解說S參數(shù)

    Nginx的詳細(xì)知識(shí)點(diǎn)講解

    Nginx是一個(gè)高性能的HTTP和反向代理服務(wù)器,特點(diǎn)是占用內(nèi)存少,并發(fā)能力強(qiáng),事實(shí)上nginx的并發(fā)能力確實(shí)在同類型的網(wǎng)頁服務(wù)器中表現(xiàn)較好 nginx專為性能優(yōu)化而開發(fā),性能是其最重要的要求,十分注重效率,有報(bào)告
    的頭像 發(fā)表于 12-26 10:25 ?2491次閱讀
    <b class='flag-5'>Nginx</b>的詳細(xì)知識(shí)點(diǎn)<b class='flag-5'>講解</b>

    運(yùn)行nginx所需的最低配置

    運(yùn)行nginx所需的最低配置: # /etc/nginx/nginx.confevents {} # event context have to be defined to consi
    的頭像 發(fā)表于 08-23 10:53 ?5413次閱讀

    限流方案常用算法 常用的限流方案

    需要注意的是借助Redis實(shí)現(xiàn)的限流方案可用于分布式系統(tǒng),而guava實(shí)現(xiàn)的限流只能應(yīng)用于單機(jī)環(huán)境。如果你覺得服務(wù)器端限流麻煩,可以在不改任何代碼的情況下直接使用容器限流
    發(fā)表于 04-08 10:50 ?358次閱讀

    Nginx常用的配置和基本功能講解

    Nginx 已經(jīng)廣泛應(yīng)用于 J-one 和 Jdos 的環(huán)境部署上,本文對 Nginx 的常用的配置和基本功能進(jìn)行講解,適合 Nginx
    的頭像 發(fā)表于 05-04 10:25 ?570次閱讀

    C++拷貝和拷貝詳解

    當(dāng)類的函數(shù)成員存在指針成員時(shí)會(huì)產(chǎn)生拷貝和拷貝和問題。
    發(fā)表于 08-21 15:05 ?286次閱讀
    C++<b class='flag-5'>深</b>拷貝和<b class='flag-5'>淺</b>拷貝詳解

    Nginx的特點(diǎn)和作用 Nginx常用命令和核心配置

    更新。性能是 Nginx 最重要的考量,其占用內(nèi)存少、并發(fā)能力強(qiáng)、能支持高達(dá) 5w 個(gè)并發(fā)連接數(shù),最重要的是, Nginx 是免費(fèi)的并可以商業(yè)化,配置使用也比較簡單。
    的頭像 發(fā)表于 09-01 09:53 ?569次閱讀
    <b class='flag-5'>Nginx</b>的特點(diǎn)和作用 <b class='flag-5'>Nginx</b>常用命令和核心<b class='flag-5'>配置</b>

    Nginx常用配置與命令

    對于前端來說 Node.js 并不陌生, Nginx 和 Node.js 的很多理念類似, HTTP 服務(wù)器、事件驅(qū)動(dòng)、異步非阻塞等,且 Nginx 的大部分功能使用 Node.js 也可以實(shí)現(xiàn),但 Nginx 和 Node.j
    發(fā)表于 10-18 10:04 ?319次閱讀
    <b class='flag-5'>Nginx</b>常用<b class='flag-5'>配置</b>與命令