Ricerca nel sito web

Come limitare la larghezza di banda della rete nel server Web NGINX


In precedenza, nella nostra serie sulla gestione del traffico e sui controlli di sicurezza NGINX, abbiamo discusso come limitare il numero di connessioni che lo stesso client può effettuare alle tue risorse web, utilizzando parametri di identificazione del client come l'indirizzo IP. Abbiamo anche spiegato come limitare la frequenza delle richieste (limitare la velocità con cui un client può effettuare richieste) per le tue risorse web.

Per garantire che la larghezza di banda di utilizzo dell'applicazione non venga utilizzata da un singolo client, è necessario controllare le velocità di caricamento e download per client. Si tratta di un comune controllo di sicurezza NGINX contro gli attacchi DoS (Denial of Service) da parte di utenti malintenzionati che stanno solo tentando di abusare delle prestazioni del sito.

In questa terza parte della serie spiegheremo come limitare la larghezza di banda della rete nel server web NGINX.

Limitazione della larghezza di banda in NGINX

Per limitare la larghezza di banda in NGINX, utilizzare la direttiva limit_rate che limita la velocità di trasmissione della risposta a un client. È valido in HTTP, server, località e istruzione if all'interno di una località block e specifica il limite di velocità per un dato contesto in byte al secondo per impostazione predefinita. Puoi anche utilizzare m per megabyte o g per gigabyte.

limit_rate 20k;

Un'altra direttiva correlata è limit_rate_after, che specifica che la connessione non dovrebbe essere limitata in velocità finché non è stata trasferita una quantità specifica di dati. Questa direttiva può essere impostata in HTTP, server, posizione e "istruzione if all'interno di un blocco di posizione".

limit_rate_after 500k;

Di seguito è riportato un esempio di configurazione per limitare a un client il download di contenuti tramite una singola connessione a una velocità massima di 20 kilobyte al secondo.

upstream api_service {
    server 10.1.1.10:9051;
    server 10.1.1.77:9052;
}

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

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

       
   }
   location /documents {
        limit_rate 20k;
        limit_rate_after 500k;  
}
}

Dopo aver aggiunto le impostazioni richieste spiegate sopra, salva le modifiche e chiudi il file. Successivamente, controlla se la sintassi di configurazione di NGINX è corretta, in questo modo:

sudo nginx -t

Se tutto è a posto, ricarica il servizio NGINX per applicare le ultime modifiche:

sudo systemctl reload nginx

Limitazione della larghezza di banda e del numero di connessioni in NGINX

Con la configurazione di cui sopra, il client può aprire diverse connessioni per aumentare la larghezza di banda. Pertanto, puoi anche limitare le connessioni per client utilizzando un parametro come un indirizzo IP come abbiamo visto prima.

Ad esempio, puoi limitare una connessione per indirizzo IP.

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;

    location / {
        try_files $uri $uri/ /index.html =404 =403 =500;
    }
    location /api {
        limit_conn   limitconnbyaddr  5;

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

       
   }
   location  /documents {
        limit_rate 50k;
        limit_rate_after 500k;  
        limit_conn   limitconnbyaddr  1;
}
}

Limitazione dinamica della larghezza di banda in NGINX

Come valore di parametro per la direttiva limit_rate, puoi specificare variabili per limitare dinamicamente la larghezza di banda. È particolarmente utile in situazioni in cui la tariffa deve essere limitata a seconda di una determinata condizione.

In questo esempio, stiamo utilizzando il blocco mappa. Ti ha permesso di creare una nuova variabile il cui valore dipende dai valori di una o più variabili originali ($slow e $limit_rate) specificate nel primo parametro.

upstream api_service {
    server 10.1.1.10:9051;
    server 10.1.1.77:9052;
}

map $slow $limit_rate {
    1     20k;
    2     30k;
}

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

    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";
   }
   location /documents {
        limit_rate $limit_rate;
        limit_rate_after 500k;
}
}

Ecco un altro esempio di configurazione per illustrare la limitazione dinamica della larghezza di banda in NGINX. Questa configurazione consente a NGINX di limitare la larghezza di banda in base alla versione TLS. La direttiva limit_rate_after 512 implica il tasso limite dopo l'invio delle intestazioni.

upstream api_service {
    server 10.1.1.10:9051;
    server 10.1.1.77:9052;
}

map $ssl_protocol $response_rate {
    "TLSv1.1" 50k;
    "TLSv1.2" 100k;
    "TLSv1.3" 500k;
}

server {
    listen 443 ssl;
    ssl_protocols       TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_certificate     /etc/ssl/testapp.crt;
    ssl_certificate_key   /etc/ssl/testapp.key;

    location / {
        limit_rate       $response_rate; # Limit bandwidth based on TLS version
        limit_rate_after 512;
        proxy_pass       http://api_service;
    }
}

Questo è tutto ciò che abbiamo per te in questa parte della serie. Continueremo a trattare più argomenti riguardanti la gestione del traffico e i controlli di sicurezza di NGINX. Ma come al solito, puoi porre domande o condividere le tue opinioni su questa guida tramite il modulo di feedback riportato di seguito.