Ricerca nel sito web

Come limitare la velocità di connessioni (richieste) in NGINX


Nel nostro ultimo articolo che fa parte della nostra serie sulla gestione del traffico NGINX, abbiamo discusso come limitare il numero di connessioni in NGINX. In questa guida vedremo come limitare il tasso di richieste in NGINX.

La limitazione della velocità è una tecnica di gestione del traffico utilizzata per limitare il numero di richieste HTTP che un cliente può effettuare in un determinato periodo di tempo: i limiti di velocità sono calcolati in Richieste al secondo (o RPS).

Un esempio di richiesta è una richiesta GET per la pagina di accesso di un'applicazione o una richiesta POST su un modulo di accesso o un POST su un endpoint API.

Esistono molti motivi per limitare la frequenza delle richieste alle applicazioni Web o ai servizi API, uno dei quali è la sicurezza: la protezione da richieste rapide abusive.

Limitare la velocità di connessione in NGINX

Inizia definendo i parametri per la limitazione della velocità utilizzando la direttiva limit_req_zone. I parametri richiesti sono una chiave per identificare i client, una zona di memoria condivisa che memorizzerà lo stato della chiave e la frequenza con cui ha avuto accesso a un URL limitato su richiesta e la velocità.

La direttiva limit_req_zone è valida nel contesto HTTP.

limit_req_zone $binary_remote_addr zone=limitreqsbyaddr:20m rate=10r/s;

Inoltre, imposta un codice di stato della risposta che viene restituito alle richieste rifiutate, utilizzando la direttiva limit_req_status che è valida nei contesti HTTP, server e posizione.

limit_req_status 429;

Ora puoi utilizzare la direttiva limitt_conn per abilitare la limitazione della velocità delle richieste nei contesti HTTP, server e posizione. Richiede una zona di memoria come parametro e altri parametri opzionali.

limit_req zone=limitreqsbyaddr;

Il seguente esempio di configurazione mostra la limitazione della frequenza di richiesta all'API di un'applicazione Web. La dimensione della memoria condivisa è 20 MB e il limite della velocità di richiesta è di 10 richieste al secondo.

upstream api_service {
    server 127.0.0.1:9051;
    server 10.1.1.77:9052;
}
limit_req_zone $binary_remote_addr zone=limitreqsbyaddr:20m rate=10r/s;
limit_req_status 429;

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

    #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 {
        limit_req zone=limitreqsbyaddr;
        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 di configurazione e chiudilo.

Controlla quindi se la sintassi di configurazione di NGINX è corretta utilizzando il seguente comando:

sudo nginx -t

Successivamente, ricarica il servizio NGINX e applica le ultime modifiche:

sudo systemctl reload nginx

Una volta che il limite di velocità di 10 richieste al secondo viene superato da un singolo client che accede a /api/, NGINX restituisce un "429 Troppe richieste" errore al cliente.

Registra inoltre l'incidente nel registro degli errori.

2022/04/29 00:30:38 [error] 3145846#0: *131039 limiting requests, excess: 0.990 by zone "limitreqsbyaddr", client: 192.168.1.10, server: testapp.linux-console.net, request: "GET /api/v1/app/meta-data HTTP/1.1", host: "testapp.linux-console.net", referrer: "https://testapp.linux-console.net/"

A volte, a seconda della natura dell'applicazione o dell'API, un client dovrà effettuare molte richieste contemporaneamente e quindi ridurre la tariffa per un periodo di tempo prima di farne di più. NGINX può anche bufferizzare eventuali richieste in eccesso in coda ed elaborarle tempestivamente.

Puoi abilitare questo comportamento nella limitazione della velocità utilizzando il parametro burst con la direttiva limit_req. Per abilitare l'accodamento senza ritardo, aggiungi il parametro nodelay.

limit_req zone=limitreqsbyaddr burst=20 nodelay;

Esiste un problema con la limitazione della velocità basata sull’IP di un client, in particolare per gli utenti che accedono all’applicazione dalla stessa rete e operano dietro un NAT. In questo caso, tutte le loro richieste proverranno dallo stesso indirizzo IP. In uno scenario di questo tipo, puoi utilizzare altre variabili per identificare i client come un cookie di sessione.

Per ulteriori informazioni sulla limitazione della velocità delle richieste, consulta questa limitazione della velocità NGINX sul sito Web NGINX. Successivamente, tratteremo come limitare l'utilizzo della larghezza di banda in NGINX.