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


NGINX toimitetaan eri moduuleilla, joiden avulla käyttäjät voivat hallita liikennettä verkkosivustoilleen, verkkosovelluksiinsa ja muihin verkkoresursseihin. Yksi tärkeimmistä syistä liikenteen tai pääsyn rajoittamiseen on estää väärinkäytökset tai tietynlaiset hyökkäykset, kuten DoS (Denial of Service) -hyökkäykset.

NGINX:ssä on kolme päätapaa rajoittaa käyttöä tai liikennettä:

  1. Yhteyksien (pyyntöjen) määrän rajoittaminen.
  2. Pyyntöjen määrän rajoittaminen.
  3. Kaistanleveyden rajoittaminen.

Yllä olevat NGINX-liikenteen hallintatavat, käyttötapauksesta riippuen, voidaan määrittää rajoittamaan määritetyn avaimen perusteella, joista yleisin on asiakkaan IP-osoite. NGINX tukee myös muita muuttujia, kuten istuntoevästeitä ja monia muita.

Tässä kolmiosaisen sarjamme ensimmäisessä osassa keskustelemme siitä, kuinka voit rajoittaa NGINX-yhteyksien määrää verkkosivustojesi/sovellustesi suojaamiseksi.

  • Kuinka rajoittaa yhteyksien (pyyntöjen) määrää NGINX:ssä – Osa 1
  • Kuinka rajoittaa yhteyksien määrää (pyyntöjä) NGINX:ssä – Osa 2
  • Kuinka rajoittaa kaistanleveyden käyttöä NGINX:ssä – Osa 3

Muista, että NGINX harkitsee yhteyden rajoittamista vain, jos palvelin käsittelee sitä pyyntöä ja koko pyynnön otsikko on jo luettu. Siksi kaikkia asiakasyhteyksiä ei lasketa.

Rajoitettu yhteyksien määrä NGINX:ssä

Ensin sinun on määritettävä jaettu muistivyöhyke, joka tallentaa yhteystiedot eri avaimille limit_conn_zone-direktiivin avulla. Kuten aiemmin mainittiin, avain voi olla teksti, muuttuja, kuten asiakkaan IP-etäosoite, tai näiden yhdistelmä.

Tämä HTTP-kontekstissa voimassa oleva käsky sisältää kaksi parametria: avaimen ja vyöhykkeen (muodossa alueen_nimi:koko).

limit_conn_zone $binary_remote_addr zone=limitconnbyaddr:20m;

Jos haluat määrittää hylättyihin pyyntöihin palautettavan vastauksen tilakoodin, käytä limit_conn_status-direktiiviä, joka ottaa HTTP-tilakoodin parametrina. Se on voimassa HTTP-, palvelin- ja sijaintikonteksteissa.

limit_conn_status 429;

Voit rajoittaa yhteyksiä asettamalla limint_conn-direktiivin avulla käytettävä muistivyöhyke ja sallittujen yhteyksien enimmäismäärä seuraavassa määrityskatkelmassa esitetyllä tavalla. Tämä ohje on voimassa HTTP-, palvelin- ja sijaintikonteksteissa.

limit_conn   limitconnbyaddr  50;

Tässä on täydellinen kokoonpano:

upstream api_service {
    server 127.0.0.1:9051;
    server 10.1.1.77:9052;
}
limit_conn_zone $binary_remote_addr zone=limitconnbyaddr:20m;
limit_conn_status 429;

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

    limit_conn   limitconnbyaddr  50;

    #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 {
        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 tiedosto ja sulje se.

Tarkista sitten, onko NGINX-kokoonpano kunnossa, suorittamalla seuraava komento:

sudo nginx -t

Lataa seuraavaksi NGINX-palvelu uudelleen tehdäksesi viimeisimmät muutokset:

sudo systemctl reload nginx

Tarkistetaan Nginx-yhteysrajaa

Kun asiakas ylittää sallittujen yhteyksien enimmäismäärän, NGINX palauttaa asiakkaalle 429 Liian monta pyyntöä -virheen ja rekisteröi alla olevan merkinnän virheeseen. loki tiedosto:

2022/03/15 00:14:00 [error] 597443#0: *127 limiting connections by zone "limitconnbyaddr", client: x.x.x.x, server: testapp.tecmimt.com, request: "GET /static/css/main.63fdefff.chunk.css.map HTTP/1.1", host: "testapp.tecmimt.com"

Rajoita Nginx-yhteyksien määrää sovellukseen

Voit myös rajoittaa tietyn palvelimen yhteyksien määrää käyttämällä muuttujaa $server_name:

upstream api_service {
    server 127.0.0.1:9051;
    server 10.1.1.77:9052;
}
limit_conn_zone $server_name zone=limitbyservers:10m;
limit_conn_status 429;

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

     limit_conn  limitbyservers  2000;

    #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 {
        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";
   }
}

Tämän kokoonpanon avulla NGINX voi rajoittaa sovelluksen testapp.linux-console.net käyttävän virtuaalipalvelimen yhteyksien kokonaismäärän 2000 yhteyteen.

Huomaa: yhteyksien rajoittamisella asiakkaan IP-osoitteen perusteella on haittapuolensa. Saatat päätyä rajoittamaan yhteyksiä useammalle kuin yhdelle käyttäjälle, varsinkin jos monet sovellustasi käyttävät käyttäjät ovat samassa verkossa ja toimivat NAT:n takana – kaikki heidän yhteydensä tulevat samasta IP-osoitteesta.

Tällaisessa tilanteessa voit käyttää yhtä tai useampaa NGINX:ssä saatavilla olevaa muuttujaa, joka voi tunnistaa asiakkaan sovellustasolla. Esimerkkinä on istuntoeväste.

Saatat pitää myös seuraavista Nginxiin liittyvistä artikkeleista:

  • Kuinka luoda mukautettu 404-virhesivu NGINX: ssä
  • Kuinka hallita pääsyä asiakkaan IP-osoitteen perusteella NGINX:ssä
  • Sisällön tallentaminen välimuistiin NGINX:ssä
  • Kuinka ottaa HTTP/2.0 käyttöön Nginxissä
  • Kuinka käyttää Nginxiä HTTP-kuormituksen tasaajana Linuxissa

Siinä se toistaiseksi! Tämän sarjan seuraavassa osassa käsittelemme toista hyödyllistä liikenteenhallintatekniikkaa NGINX:ssä – pyyntöjen määrän rajoittamista. Siihen asti, pysy kanssamme.