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


NGINX toimitetaan erilaisilla 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.

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

  1. Rajoitetaan yhteyksien (pyyntöjen) määrää.
  2. Pyyntöjen määrän rajoittaminen.
  3. Rajoitetaan kaistanleveyttä.

Yllä olevat NGINX-liikenteen hallintamenetelmät voidaan käyttötapauksesta riippuen konfiguroida rajoittamaan määritellyn 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
  • Miten rajoittaa yhteyksien määrää (pyyntöjä) NGINX:ssä – Osa 2
  • Kaistanleveyden käytön rajoittaminen NGINX:ssä – Osa 3

Muista, että NGINX harkitsee yhteyden rajoittamista vain, jos palvelin käsittelee 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 käyttämällä limit_conn_zone-direktiiviä. Kuten aiemmin mainittiin, avain voi olla teksti, muuttuja, kuten asiakkaan IP-etäosoite, tai näiden yhdistelmä.

Tämä HTTP-kontekstissa voimassa oleva direktiivi ottaa kaksi parametria: avaimen ja vyöhykkeen (muodossa vyöhykkeen_nimi:koko).

limit_conn_zone $binary_remote_addr zone=limitconnbyaddr:20m;

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

limit_conn_status 429;

Jos haluat rajoittaa yhteyksiä, käytä limint_conn-direktiiviä määrittämään käytettävä muistivyöhyke ja sallittujen yhteyksien enimmäismäärä seuraavan konfigurointikoodinpätkän mukaisesti. 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 virhelokitiedostoon:

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 yhteyksien kokonaismäärän virtuaalipalvelimeen, joka toimii sovelluksen testapp.linux-console.net avulla, 2000 yhteyteen.

Huomautus: Asiakkaan IP-osoitteeseen perustuvien yhteyksien rajoittamisella 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, esimerkiksi istuntoeväste.

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

  • Mukautetun 404-virhesivun luominen NGINX:ssä
  • Näin hallita pääsyä asiakkaan IP-osoitteen perusteella NGINX:ssä
  • Sisällön tallentaminen välimuistiin NGINX:ssä
  • HTTP/2.0:n käyttöönotto Nginxissä
  • Nginxin käyttäminen 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.