A feldolgozási kérelmek sebességének korlátozása nginxben

  • 11.07.17 07:57 •
  • légy •
  • # 329876 •
  • Habrahabr •
  • Fordítás •
  • 11 •
  • 4500

- ugyanaz, mint Forbes, csak jobb.

A feldolgozási kérelmek sebességének korlátozása nginxben

Wonderlane képe

NGINX nagyszerű! Itt csak a feldolgozási kérelmek gyorsaságát korlátozó dokumentuma tűnik számomra, hogyan mondhatnám ezt, némileg korlátozott. Ezért úgy döntöttem, hogy ezt a kézikönyvet a NGINX-ben a feldolgozási kérelmek (sebességmélyítés) és a forgalomformálás (forgalomformálás) sebességének korlátozásáról írom.


  • írja le a NGINX iránymutatásait,
  • megérteni a NGINX elfogadási / elutasító logikával,
  • szemléltesse a különböző helyszínek forgalmának feldolgozását.

Ezenkívül létrehoztam egy GitHub tárat és egy Docker képet. amivel kísérletet tehet és reprodukálhatja az ebben a cikkben megadott teszteket. A gyakorlatban mindig könnyebb megtanulni.

Az NGINX irányelvei a feldolgozási kérelmek sebességének korlátozására

Ebben a cikkben a ngx_http_limit_req_moduleról beszélünk. amelyben a limit_req_zone irányelveket hajtják végre. limit_req. limit_req_status és limit_req_level. Lehetővé teszik, hogy ellenőrizze az elutasított kérelmek HTTP állapotkódjának értékét, valamint a hibák naplózását.

Leggyakrabban a lekérdezés elutasításának logikájába zavarják.

Először meg kell értened a limit_req direktívát. amely zóna paramétert igényel. Opcionális paramétereket is tartalmaz a burst és a nodelay számára.

A következő fogalmakat használjuk itt:

a kitörés opcionális paraméter. A telepítés után meghatározza a megteendő alapsebesség-határértéket meghaladó feldolgozásra kerülő kérelmek számát. Fontos megérteni, hogy a kitörés a kérelmek számának abszolút értéke, nem pedig a sebesség.


  • A csomópont szintén opcionális paraméter, amelyet a burst alkalmazásával együtt használnak. Az alábbiakban megértjük, miért van szükség.

  • Hogyan dönt a NGINX, hogy elfogadja vagy elutasítja-e a kérelmet?

    A zóna beállításakor a sebesség beállítása történik. Például 300r / m 300 kérés percenként fogadható el, másodpercenként pedig 5r / s - 5 kérelem.


    • limit_req_zone $ request_uri zóna = zóna1: 10 m arány = 300r / m;
    • limit_req_zone $ request_uri zóna = zóna2: 10 m arány = 5 / s;

    Fontos megérteni, hogy ez a két zóna azonos határokkal rendelkezik. Az NGINX frekvenciaparaméter segítségével kiszámolja a frekvenciát, és ennek megfelelően azt az intervallumot, amely után új kérést fogadhat el. Ebben az esetben az NGINX egy szivárgó vödör nevű algoritmust fog használni.

    Az NGINX 300r / m és az 5r / s esetén ugyanazok vannak: minden kérés 0,2 másodpercenként kihagyja. Ebben az esetben az NGINX minden 0.2 másodpercenként zászlót állít be, hogy lehetővé tegye a kérés fogadását. Amikor egy kérés érkezik erre a zónára, az NGINX eltávolítja a zászlót, és feldolgozza a kérést. Ha kap egy újabb kérést, és az időzítő idő csomagok között, még mindig nem működik, a kérelmet el kell utasítani a status code 503. Ha az idő letelt, de a zászló már be van állítva, hogy lehetővé tegyék a befogadási értékét, semmilyen művelet nem hajtható végre.

    Szükség van a feldolgozási kérelmek sebességének korlátozására és a forgalom alakítására?

    Beszéljünk a burst paraméterről. Képzeld el, hogy a zászló, amelyről beszéltünk, nagyobb értéket vehet fel. Ebben az esetben ez tükrözi azon kérelmek maximális számát, amelyeket az NGINX egyetlen sorozatban elszalaszt.

    Most ez nem egy "vödör vödör", egy "token vödör". A sebességparaméter meghatározza a kérések közötti időintervallumot, de nem a true / false típusú típusú tokennel foglalkozunk, hanem a 0-1 + burst számlálóval. A számláló növekszik minden egyes alkalommal, amikor a kiszámított időintervallum elhalad (az időzítő elindul), elérve a maximális értéket b + 1-ben. Hadd emlékeztessem még egyszer: a kérések száma, nem pedig a továbbítás sebessége.

    Amikor új kérés érkezik, az NGINX ellenőrzi a token elérhetőségét (számláló> 0). Ha a token nem érhető el, a kérés elutasításra kerül. Ellenkező esetben a kérelmet elfogadják és feldolgozzák, és a jelzőt elfogyasztják (a számlálót egyenként csökkentik).

    Nos, ha nincsenek feltöltött tört jelzők, az NGINX elfogadja a kérést. De mikor fog feldolgozni?

    Hoztunk létre egy határ 5R / s, míg nginx fogadjon kéréseket meghaladó, ha van egy tört-tokenek állnak rendelkezésre, de elhalasztja annak feldolgozása, hogy fenntartsa a beállított sebességet. Vagyis ezek a sorozatok kéréseinek feldolgozása valamilyen késéssel vagy késleltetéssel történik.

    Más szavakkal, az NGINX nem lépi túl a zónára vonatkozó határértéket, de további kéréseket helyez a várakozási sorban, és késleltetéssel feldolgozza azokat.

    Íme egy egyszerű példa: azt mondjuk, hogy van 1r / s határ és 3 sorozata. Mi történik, ha az NGINX egyszerre 5 kérelmet kap?


    • Az elsőt elfogadják és feldolgozzák.
    • Mivel legfeljebb 1 + 3 engedélyezett, egy kérést azonnal el kell utasítani az 503-as állapotkóddal.
    • A három fennmaradó egységet egyenként, de nem azonnal kell feldolgozni. Az NGINX 1r / s sebességgel ugrik. a megállapított határon belül marad, és feltéve, hogy nem érkeznek új kérelmek, amelyek szintén használják a kvótát. Amikor a sor üres, a számláló újra elkezd növekedni (a token kosár elkezd kitölteni).

    Abban az esetben, nginx alkalmazás proxy szerver mögött található ez szolgáltatásokat kap kéréseket sebesség 1r / s, és nem tud a forgalom élénk, simított a proxy szerver.

    Tehát csak forgalmi formázást állítottunk be, késleltetve a lekérdezések tördelését és az adatáramlást.

    a nodelay azt mondja a NGINX-nak, hogy be kell fogadnia a csomagokat a burst érték által meghatározott ablakban. és azonnal feldolgozza azokat (valamint a normál kéréseket).

    Ennek eredményeképpen a forgalmi bomlások továbbra is eljutnak a NGINX mögötti szolgáltatásokhoz, de ezek a burstok a burst értékét korlátozzák.

    A kérelmek feldolgozásához szükséges sebességkorlátozások megjelenítése

    Mivel úgy vélem, hogy ez a gyakorlat sok mindent meg tud emlékezni, egy kis Docker képet készítettem a NGINX-szel a fedélzeten. Vannak konfigurált erőforrások, amelyekre a feldolgozási kérelmek sebességének korlátozására szolgáló különböző lehetőségek kerülnek megvalósításra: alapeseti korlátozással, sebességkorlátozással, burst használatával. valamint burst és nodelay. Lássuk, hogyan működnek.

    Itt egy meglehetősen egyszerű NGINX konfigurációt használunk (ez a Docker-képben is megtalálható, amely link a cikk végén található):

    Teszt konfiguráció NGINX különféle lehetőségekkel a feldolgozási kérelmek sebességének korlátozására

    Minden tesztben, ezzel a konfigurációval együtt, 10 párhuzamos kérést küldünk egyszerre.

    Megtudjuk, mit:


    • hány kérelmet elutasítanak a sebességhatárok miatt?
    • Mi a beérkezett kérelmek feldolgozási sebessége?

    Az erőforráshoz 10 egyidejű kérést készítünk a feldolgozási kérelmek sebességének korlátozásával

    10 egyidejű kérés egy erőforráshoz, amelynek sebességkorlátja a kérések feldolgozásához

    Konfigurációnkban 30 kérés percenként engedélyezett. De ebben az esetben 10-ből 9-et elutasítanak. Ha alaposan elolvassa az előző szakaszokat, az NGINX viselkedése nem fog meglepődni: 30r / m azt jelenti, hogy csak egy kérés érhető el 2 másodpercen belül. Példánkban 10 kérelem érkezik egyszerre, az egyiket kihagyjuk, és a másik kilencet elutasítjuk, mert az NGINX látható, mielőtt az időzítő engedélyezi a következő kérést.

    Az ügyfelek / végpontok iránti aprólékos kérdéseket túl fogom élni

    Jó! Ezután hozzáfűzzük az argumentum törését = 5. amely lehetővé teszi a NGINX számára, hogy a zónák ezen végpontjaihoz tartozó kis kéréscsomagokat átugorja a feldolgozási kérelmek sebességének korlátozásával:

    10 párhuzamos kérés az erőforráshoz, az argumentum törés = 5

    Mi történt itt? Amint azt elvárnánk, a felrobbantott érveléssel 5 további kérés érkezett, és a beérkezett kérelmek arányát a teljes számukra 1/10-ról 6/10-ra növeltük (a többit elutasították). Könnyű látni, hogy az NGINX frissíti a tokeneket és feldolgozza a fogadott kéréseket - a kimenő sebesség 30r / m-re korlátozódik. ami 2 másodpercenként egy kérésnek felel meg.

    Az első kérésre adott válasz 0,2 másodperc múlva jelenik meg. Az időzítő 2 másodperc elteltével indul, az egyik folyamatban lévő kérés feldolgozása, és az ügyfél megkapja a választ. Az út oda-vissza útja 2,02 másodperc volt. További 2 másodperc elteltével az időzítő újra aktiválódik, lehetőséget adva egy másik kérelem feldolgozására, amelyet 4,02 másodperces teljes utazási idővel adnak vissza. És így tovább ...

    Így a felszakítási argumentum lehetővé teszi, hogy az NGINX kérések feldolgozásának sebességét korlátozzák egy egyszerű küszöbszűrőből egy forgalombizálóhoz.

    A szerverem ellenáll az extra terhelésnek, de a feldolgozási kérelmek sebességkorlátját szeretném használni a túlterhelés megakadályozása érdekében

    Ebben az esetben a nodelay argumentum hasznos lehet. Küldje el ugyanazt a 10 lekérdezést a végponthoz a burst beállítással = 5 nodelay:

    10 párhuzamos kérés az erőforráshoz, az argumentum burst = 5 nodelay

    Ahogy a várakozások szerint a robbanás = 5. ugyanolyan arányban lesz a 200-as és az 503-as státuszkód. De a kimenő sebesség nem korlátozódik egyetlen kérésre 2 másodpercenként. Amíg rendelkezésre állnak feltörési tokenek, a bejövő kérelmeket azonnal elfogadják és feldolgozzák. Az időzítő sebessége még mindig fontos a töredékjelek számának feltöltése szempontjából, de a késedelem nem vonatkozik a beérkezett kérelmekre.

    Összegezzük az eredményeket

    Próbáljuk megnézni, hogy a NGINX hogyan fogadja be a beérkező kéréseket és feldolgozza azokat a sebességparaméterek alapján. tört és csomó.

    Ahhoz, hogy a dolgok egyszerű, megjeleníti a beérkező kérések (amelyeket aztán elutasították vagy elfogadták és feldolgozott) A meghatározott beállítások idővonal zóna bontották egyenlő szegmensében a pickup időzítőt. Az időintervallum abszolút értéke nem jelentős. Az NGINX által minden lépésben feldolgozható kérések száma fontos.

    Itt van a forgalom, amelyet a kérések feldolgozásához szükséges sebességkorlátozás különböző beállításain keresztül futtathatunk:


    A feldolgozási kérelmek sebességének korlátozása nginxben

    A bejövő kérelmek és lekérdezési feldolgozási sebességkorlátozások a zónában


    A feldolgozási kérelmek sebességének korlátozása nginxben

    Fogadott és elutasított kérelmek (a burst beállítás nincs megadva)

    Burkolat nélkül (azaz ha burst = 0), az NGINX végrehajtja a sebességkorlátozó funkcióját. A kérelmeket azonnal feldolgozzák vagy elutasítják.

    Ha azt akarjuk, hogy a kis pörgős forgalmat, például, hogy dozagruzit teljesítményt a megállapított korlátot, akkor adjunk hozzá egy tört érv. ami a rendelkezésre álló burstjelzőkön belül érkezett kérelmek feldolgozásának késleltetését jelenti:


    A feldolgozási kérelmek sebességének korlátozása nginxben

    Elfogadott, késleltetett és elutasított kérelmek (burst használatával)

    Látjuk, hogy az elutasított kérelmek száma csökkent. Csak azokat a nagysebességű kéréseket utasították el, amelyek akkor jöttek, amikor nem állt rendelkezésre burst-token. Ilyen beállításokkal az NGINX teljes körű forgalmi formát valósít meg.

    Végül nginx lehet használni, ami végül a kevésbé stabil kimenő díjat forgalomirányítási korlátozásával kérés löketméret (tört), de részben a lökésszerű kérelmek elérik rakodók (upstream vagy helyi), de javítja a hálózat késleltetését ( ha természetesen kezelheti ezeket a további kéréseket):


    A feldolgozási kérelmek sebességének korlátozása nginxben

    Elfogadott, feldolgozott és visszautasított kérelmek (a csomópontos csíkot használják)

    Játssz a sebességkorlátozási kérelmekkel

    Most, hogy jobban biztosítsák a megértése a vitaanyagot, akkor vizsgálja meg a kódot másolja az adattár kísérletezni és képzett Docker-módon:

    Nem értem, miért, a rövidség kedvéért, a fogalom-korlátozás kifejezés fordítására, ne dobd le az utolsó két szót. Úgy gondolom, hogy mindenki megérti, milyen "sebességkorlátozás" a nginx kontextusában a kérdés. Nincs más értelmezés és esetleges kétértelműség.

    Számomra a sebesség limit_rate (az előbbin nginx-ben jelent meg). Az eredeti úgy tűnik, túl ügyetlenül írt ... helyettesítése fogalmak)), hogy még mindig korlátozza a cikket _not_ ponyatno_. Sőt, írsz a forgalom alakításáról, de semmi sem)))

    Kapcsolódó cikkek