Ricerca nel sito web

Come limitare il numero di connessioni (richieste) in NGINX


NGINX viene fornito con vari moduli per consentire agli utenti di controllare il traffico verso i propri siti Web, applicazioni Web e altre risorse Web. Uno dei motivi principali per limitare il traffico o l'accesso è prevenire abusi o attacchi di determinati tipi come gli attacchi DoS (Denial of Service).

Esistono tre modi principali per limitare l'uso o il traffico in NGINX:

  1. Limitazione del numero di connessioni (richieste).
  2. Limitare il tasso di richieste.
  3. Limitazione della larghezza di banda.

Gli approcci di gestione del traffico NGINX sopra menzionati, a seconda del caso d'uso, possono essere configurati per limitare in base a una chiave definita, il più comune dei quali è l'indirizzo IP di un client. NGINX supporta anche altre variabili come un cookie di sessione e molte altre.

In questa prima parte della nostra serie in tre parti, discuteremo come limitare il numero di connessioni in NGINX per salvaguardare i tuoi siti web/applicazioni.

  • Come limitare il numero di connessioni (richieste) in NGINX – Parte 1
  • Come limitare la velocità di connessioni (richieste) in NGINX – Parte 2
  • Come limitare l'utilizzo della larghezza di banda in NGINX – Parte 3

Tieni presente che NGINX considererà una connessione da limitare solo se ha una richiesta in elaborazione dal server e l'intera intestazione della richiesta è già stata letta. Pertanto non vengono conteggiate tutte le connessioni client.

Limitare il numero di connessioni in NGINX

Innanzitutto, devi definire una zona di memoria condivisa che memorizzi le metriche di connessione per varie chiavi, utilizzando la direttiva limit_conn_zone. Come accennato in precedenza, una chiave può essere un testo, una variabile come l’indirizzo IP remoto di un client o una combinazione dei due.

Questa direttiva valida nel contesto HTTP accetta due parametri: la chiave e la zona (nel formato nome_zona:dimensione).

limit_conn_zone $binary_remote_addr zone=limitconnbyaddr:20m;

Per impostare un codice di stato della risposta che viene restituito alle richieste rifiutate, utilizza la direttiva limit_conn_status che accetta un codice di stato HTTP come parametro. È valido nei contesti HTTP, server e posizione.

limit_conn_status 429;

Per limitare le connessioni, utilizzare la direttiva limitt_conn per impostare la zona di memoria da utilizzare e il numero massimo di connessioni consentite come mostrato nel seguente snippet di configurazione. Questa direttiva è valida nei contesti HTTP, server e posizione.

limit_conn   limitconnbyaddr  50;

Ecco la configurazione completa:

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

Salva il file e chiudilo.

Quindi controlla se la configurazione di NGINX va bene eseguendo il seguente comando:

sudo nginx -t

Successivamente, ricarica il servizio NGINX per rendere effettive le modifiche recenti:

sudo systemctl reload nginx

Verifica del limite di connessione Nginx

Quando un client supera il numero massimo di connessioni consentite, NGINX restituisce un errore "429 Troppe richieste" al client e registra una voce come quella seguente nell'errore file di registro:

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"

Limitazione del numero di connessioni Nginx all'applicazione

Puoi anche limitare il numero di connessioni per un determinato server utilizzando la variabile $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";
   }
}

Questa configurazione consente a NGINX di limitare il numero totale di connessioni al server virtuale che alimenta l'applicazione testapp.linux-console.net, a 2000 connessioni.

Nota: limitare le connessioni in base all'IP di un cliente presenta uno svantaggio. Potresti finire per limitare le connessioni per più di un solo utente, soprattutto se molti utenti che accedono alla tua applicazione si trovano sulla stessa rete e operano dietro un NAT: tutte le loro connessioni avranno origine dallo stesso indirizzo IP.

In uno scenario di questo tipo, puoi utilizzare una o più variabili disponibili in NGINX in grado di identificare un client a livello di applicazione, un esempio è un cookie di sessione.

Potrebbero interessarti anche i seguenti articoli relativi a Nginx:

  • Come creare una pagina di errore 404 personalizzata in NGINX
  • Come controllare l'accesso in base all'indirizzo IP del client in NGINX
  • Come memorizzare nella cache i contenuti in NGINX
  • Come abilitare HTTP/2.0 in Nginx
  • Come utilizzare Nginx come bilanciatore del carico HTTP in Linux

Per ora è tutto! Nella prossima parte di questa serie, discuteremo un'altra utile tecnica di gestione del traffico in NGINX: limitare il tasso di richieste. Fino ad allora, resta con noi.