Hvernig á að takmarka hlutfall tenginga (beiðnir) í NGINX


Í síðustu grein okkar sem er hluti af NGINX umferðarstjórnunaröðinni okkar, ræddum við hvernig á að takmarka fjölda tenginga í NGINX. Í þessari handbók munum við skoða hvernig á að takmarka hlutfall beiðna í NGINX.

Hraðatakmörkun er umferðarstjórnunartækni sem notuð er til að takmarka fjölda HTTP-beiðna sem viðskiptavinur getur gert á tilteknu tímabili - takmörk fyrir hraða eru reiknuð út í beiðnum á sekúndu (eða RPS).

Dæmi um beiðni er GET beiðni fyrir innskráningarsíðu forrits eða POST beiðni á innskráningareyðublaði eða POST á API endapunkti.

Það eru margar ástæður til að takmarka hlutfall beiðna við vefforritin þín eða API þjónustu, ein er öryggi: vernd gegn hröðum móðgandi beiðnum.

Takmarkandi hlutfall tenginga í NGINX

Byrjaðu á því að skilgreina færibreytur fyrir hraðatakmörkun með limit_req_zone tilskipuninni. Nauðsynlegar færibreytur eru lykill til að auðkenna viðskiptavini, samnýtt minnissvæði sem mun geyma stöðu lykilsins og hversu oft hann hefur fengið aðgang að vefslóð sem er takmarkaður við beiðni, og gengi.

limit_req_zone tilskipunin er gild innan HTTP samhengisins.

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

Stilltu einnig svarstöðukóða sem er skilað til hafnaðra beiðna, með því að nota limit_req_status tilskipunina sem er gild innan HTTP, netþjóns og staðsetningarsamhengis.

limit_req_status 429;

Nú geturðu notað limint_conn tilskipunina til að virkja takmörkun beiðnahraða innan HTTP, netþjóns og staðsetningarsamhengis. Það tekur minnissvæði sem færibreytu og aðrar valfrjálsar breytur.

limit_req zone=limitreqsbyaddr;

Eftirfarandi stillingardæmi sýnir takmörkun á hraða beiðna við forritaskil vefforrita. Stærð samnýtts minnis er 20 MB og hámark beiðnahraða er 10 beiðnir á sekúndu.

upstream api_service {
    server 127.0.0.1:9051;
    server 10.1.1.77:9052;
}
limit_req_zone $binary_remote_addr zone=limitreqsbyaddr:20m rate=10r/s;
limit_req_status 429;

server {
    listen 80;
    server_name testapp.linux-console.net;
    root /var/www/html/testapp.linux-console.net/build;
    index index.html;

    #include snippets/error_pages.conf;
    proxy_read_timeout 600;
    proxy_connect_timeout 600;
    proxy_send_timeout 600;
    location / {
        try_files $uri $uri/ /index.html =404 =403 =500;
    }
    location /api {
        limit_req zone=limitreqsbyaddr;
        proxy_pass http://api_service;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

       
   }
}

Vistaðu stillingarskrána þína og lokaðu henni.

Athugaðu síðan hvort setningafræði NGINX stillingar sé rétt með því að nota eftirfarandi skipun:

$ sudo nginx -t

Eftir það skaltu endurhlaða NGINX þjónustuna og beita nýjustu breytingunum:

$ sudo systemctl reload nginx

Þegar einn viðskiptavinur sem hefur aðgang að /api/ hefur farið yfir 10 beiðnir á sekúndu, skilar NGINX villunni „429 of margar beiðnir“ til viðskiptavinarins.

Það skráir einnig atvikið í villuskránni.

2022/04/29 00:30:38 [error] 3145846#0: *131039 limiting requests, excess: 0.990 by zone "limitreqsbyaddr", client: 192.168.1.10, server: testapp.linux-console.net, request: "GET /api/v1/app/meta-data HTTP/1.1", host: "testapp.linux-console.net", referrer: "https://testapp.linux-console.net/"

Stundum þarf viðskiptavinur að gera margar beiðnir í einu, allt eftir eðli umsóknar þinnar eða API, og lækka síðan hlutfall þess í nokkurn tíma áður en hann gerir fleiri. NGINX getur einnig buffað allar umframbeiðnir í biðröð og unnið úr þeim tafarlaust.

Þú getur virkjað þessa hegðun í hraðatakmörkun með því að nota burst færibreytuna með limit_req tilskipuninni. Til að virkja biðröð án tafar skaltu bæta við nodelay færibreytunni.

limit_req zone=limitreqsbyaddr burst=20 nodelay;

Það er hængur á hraðatakmörkun byggt á IP viðskiptavinar, sérstaklega fyrir notendur sem fá aðgang að forritinu þínu frá sama neti og starfa á bak við NAT. Í þessu tilviki munu allar beiðnir þeirra koma frá sömu IP tölu. Í slíkri atburðarás geturðu notað aðrar breytur til að bera kennsl á viðskiptavini eins og setukaka.

Fyrir frekari upplýsingar um takmörkun á hlutfalli beiðna, skoðaðu þessa NGINX taxtatakmörkun á NGINX vefsíðunni. Næst munum við fjalla um hvernig á að takmarka bandbreiddarnotkun í NGINX.