Kuinka rajoittaa yhteyksien määrää (pyyntöjä) NGINX:ssä


Viimeisessä artikkelissamme, joka on osa NGINX-liikenteenhallintasarjaamme, keskustelimme kuinka rajoittaa yhteyksien määrää NGINX:ssä. Tässä oppaassa tarkastellaan, kuinka pyyntöjen määrää voidaan rajoittaa NGINX:ssä.

Nopeudenrajoitus on liikenteenhallintatekniikka, jota käytetään rajoittamaan HTTP-pyyntöjen määrää, joita asiakas voi tehdä tietyn ajanjakson aikana – nopeusrajoitukset lasketaan muodossa Pyynnöt per sekunti (tai RPS).

Esimerkki pyynnöstä on GET-pyyntö sovelluksen kirjautumissivulle tai POST-pyyntö kirjautumislomakkeella tai POST-pyyntö. API-päätepisteessä.

On monia syitä rajoittaa verkkosovellustesi tai API-palveluidesi pyyntöjen määrää, yksi niistä on turvallisuus: suojautuminen väärinkäyttäviltä nopeilta pyynnöiltä.

Yhteyksien rajanopeus NGINX:ssä

Aloita määrittämällä nopeuden rajoituksen parametrit limit_req_zone-direktiivin avulla. Vaaditut parametrit ovat avain asiakkaiden tunnistamiseen, jaettu muistivyöhyke, joka tallentaa avaimen tilan ja kuinka usein se on käyttänyt pyyntörajoitettua URL-osoitetta, sekä nopeus.

limit_req_zone-direktiivi on kelvollinen HTTP-kontekstissa.

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

Aseta myös vastauksen tilakoodi, joka palautetaan hylättyihin pyyntöihin käyttämällä limit_req_status-direktiiviä, joka on voimassa HTTP-, palvelin- ja sijaintikonteksteissa.

limit_req_status 429;

Nyt voit käyttää limint_conn-direktiiviä ottaaksesi käyttöön pyyntönopeuden rajoittamisen HTTP-, palvelin- ja sijaintikonteksteissa. Se ottaa muistivyöhykkeen parametrina ja muita valinnaisia parametreja.

limit_req zone=limitreqsbyaddr;

Seuraava määritysesimerkki näyttää pyyntönopeuden rajoittamisen verkkosovelluksen API:lle. Jaetun muistin koko on 20 MB ja pyyntöjen nopeusrajoitus on 10 pyyntöä sekunnissa.

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";

       
   }
}

Tallenna asetustiedosto ja sulje se.

Tarkista sitten, onko NGINX-määrityssyntaksi oikea käyttämällä seuraavaa komentoa:

sudo nginx -t

Lataa sen jälkeen NGINX-palvelu uudelleen ja ota käyttöön viimeisimmät muutokset:

sudo systemctl reload nginx

Kun yksittäinen /api/-käyttäjän asiakas ylittää nopeusrajan, joka on 10 pyyntöä sekunnissa, NGINX palauttaa "429 liian monta pyyntöä" virhe asiakkaalle.

Se myös kirjaa tapahtuman virhelokiin.

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/"

Joskus sovelluksesi tai sovellusliittymäsi luonteesta riippuen asiakkaan on tehtävä useita pyyntöjä kerralla ja sitten vähennettävä pyyntöään jonkin aikaa ennen kuin tekee lisää. NGINX voi myös puskuroida ylimääräiset pyynnöt jonossa ja käsitellä ne nopeasti.

Voit ottaa tämän toiminnan käyttöön nopeuden rajoituksessa burst-parametrilla limit_req-käskyn kanssa. Jos haluat ottaa jonotuksen käyttöön ilman viivettä, lisää nodelay-parametri.

limit_req zone=limitreqsbyaddr burst=20 nodelay;

Asiakkaan IP-osoitteeseen perustuva nopeusrajoitus on ongelma, erityisesti käyttäjille, jotka käyttävät sovellustasi samasta verkosta ja toimivat NAT:n takana. Tässä tapauksessa kaikki heidän pyyntönsä tulevat samasta IP-osoitteesta. Tällaisessa tilanteessa voit käyttää muita muuttujia asiakkaiden tunnistamiseen, kuten istuntoevästettä.

Saat lisätietoja pyyntöjen määrän rajoittamisesta tutustumalla tähän NGINX-nopeusrajoitukseen NGINX-verkkosivustolla. Seuraavaksi käsittelemme kaistanleveyden käytön rajoittamista NGINX:ssä.