Kuidas piirata ühenduste (päringute) arvu NGINX-is


NGINX tarnitakse koos erinevate moodulitega, mis võimaldavad kasutajatel juhtida liiklust oma veebisaitidele, veebirakendustele ja muudele veebiressurssidele. Üks liikluse või juurdepääsu piiramise peamisi põhjuseid on teatud tüüpi kuritarvituste või rünnakute, näiteks teenuse keelamise (DoS) rünnakute ärahoidmine.

NGINX-i kasutamise või liikluse piiramiseks on kolm peamist viisi:

  1. Ühenduste (päringute) arvu piiramine.
  2. Taotluste määra piiramine.
  3. Ribalaiuse piiramine.

Ülaltoodud NGINX-i liikluse haldamise lähenemisviise saab olenevalt kasutusjuhtumist konfigureerida piirama määratletud võtme alusel, millest kõige tavalisem on kliendi IP-aadress. NGINX toetab ka muid muutujaid, nagu seansiküpsis ja palju muud.

Meie kolmeosalise seeria esimeses osas arutame, kuidas piirata NGINX-i ühenduste arvu, et kaitsta oma veebisaite/rakendusi.

  • Kuidas piirata ühenduste (taotluste) arvu NGINX-is – 1. osa
  • Kuidas piirata ühenduste määra (päringuid) NGINX-is – 2. osa
  • Kuidas piirata ribalaiuse kasutamist NGINX-is – 3. osa

Pidage meeles, et NGINX kaalub ühenduse loomist piiramiseks ainult siis, kui server töötleb päringut ja kogu päringu päis on juba loetud. Seetõttu ei arvestata kõiki kliendiühendusi.

Piiratud ühenduste arv NGINX-is

Esiteks peate määratlema ühismälu tsooni, mis salvestab erinevate võtmete ühendusmõõdikud, kasutades direktiivi limit_conn_zone. Nagu varem mainitud, võib võti olla tekst, muutuja, näiteks kliendi IP-aadress, või nende kahe kombinatsioon.

Sellel HTTP-kontekstis kehtival direktiivil on kaks parameetrit: võti ja tsoon (vormingus tsooni_nimi:suurus).

limit_conn_zone $binary_remote_addr zone=limitconnbyaddr:20m;

Tagasilükatud päringutele tagastatava vastuse olekukoodi määramiseks kasutage käskkirja limit_conn_status, mis võtab parameetrina HTTP olekukoodi. See kehtib HTTP, serveri ja asukoha kontekstis.

limit_conn_status 429;

Ühenduste piiramiseks kasutage käsku limint_conn, et määrata kasutatav mälutsoon ja maksimaalne lubatud ühenduste arv, nagu on näidatud järgmises konfiguratsioonijupis. See direktiiv kehtib HTTP, serveri ja asukoha kontekstis.

limit_conn   limitconnbyaddr  50;

Siin on täielik konfiguratsioon:

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.tecmint.com;
    root /var/www/html/testapp.tecmint.com/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";
   }
}

Salvestage fail ja sulgege see.

Seejärel kontrollige, kas NGINX-i konfiguratsioon on korras, käivitades järgmise käsu:

$ sudo nginx -t

Järgmisena laadige teenus NGINX uuesti, et rakendada hiljutisi muudatusi:

$ sudo systemctl reload nginx

Nginxi ühenduse piirangu kontrollimine

Kui klient ületab maksimaalse lubatud ühenduste arvu, tagastab NGINX kliendile tõrketeate \429 Liiga palju taotlusi ja registreerib vealogifailis kirje, näiteks alloleva:

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"

Nginxi rakenduste ühenduste arvu piiramine

Samuti saate piirata antud serveri ühenduste arvu, kasutades muutujat $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.tecmint.com;
    root /var/www/html/testapp.tecmint.com/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";
   }
}

See konfiguratsioon võimaldab NGINX-il piirata rakendust testapp.tecmint.com toitava virtuaalserveriga ühenduste koguarvu 2000 ühenduseni.

Märkus. Kliendi IP-l põhinevate ühenduste piiramisel on negatiivne külg. Võite piirata ühendusi rohkem kui ühe kasutaja jaoks, eriti kui paljud teie rakendusele juurdepääsu kasutavad kasutajad on samas võrgus ja töötavad NAT-i taga – kõik nende ühendused pärinevad samalt IP-aadressilt.

Sellise stsenaariumi korral saate kasutada ühte või mitut NGINX-is saadaolevat muutujat, mis tuvastavad kliendi rakenduse tasemel, näiteks seansiküpsis.

Samuti võivad teile meeldida järgmised Nginxiga seotud artiklid:

  • Kuidas luua kohandatud 404 vealehte NGINX-is
  • Kuidas juhtida juurdepääsu kliendi IP-aadressi alusel NGINX-is
  • Sisu vahemällu salvestamine NGINX-is
  • Kuidas lubada HTTP/2.0 Nginxis
  • Kuidas kasutada Nginxit HTTP-koormuse tasakaalustajana Linuxis

See selleks korraks on kõik! Selle seeria järgmises osas käsitleme teist kasulikku liikluse haldamise tehnikat NGINX-is – päringute määra piiramist. Seni jääge meiega.