Come utilizzare la limitazione della velocità su Nginx

0
134

La limitazione della velocità controlla il numero di richieste che gli utenti possono inviare al tuo sito. Questo di solito viene messo in atto per fermare i bot abusivi, limitare i tentativi di accesso e controllare l'utilizzo dell'API, che può impedire al tuo server di rallentare sotto carico.

La limitazione della velocità non può sempre salvarti da enormi picchi di traffico, quindi se il tuo server ha davvero bisogno di protezione, è buona norma impostare un CDN completo del sito o almeno impostare il bilanciamento del carico HAProxy per suddividere il carico su più server.

Come abilitare la limitazione della frequenza in Nginx

Innanzitutto, dobbiamo definire una “zona.” È possibile impostare più zone e assegnare diversi blocchi di posizioni a ciascuna zona. Per ora, creiamo una zona di base aggiungendo la seguente riga al tuo server o al blocco di contesto http:

limit_req_zone $binary_remote_addr zone=foo:10m rate=5r/s;

Il comando limit_req_zone definisce una zona utilizzando $binar_remote_addr come identificatore. Questo è l'indirizzo IP del client, ma potresti anche usare qualcosa come $server_name per limitarlo per server.

Il flag di zona nomina la zona (in questo caso, “pippo”) e alloca un blocco di memoria per la zona. Nginx ha bisogno di memorizzare gli indirizzi IP da controllare, quindi ha bisogno di memoria per ogni zona. In questo caso, 10m alloca 10 megabyte di memoria, sufficienti per 160.000 connessioni al secondo (che probabilmente non vedrai mai su un singolo server).

Pubblicità

Il flag finale è la velocità, che definisce il numero predefinito di connessioni consentite a ciascun client. Qui è impostato su 5 richieste al secondo, con 10 come massimo, anche se puoi impostarlo più lentamente formattandolo come 30r/m (per 30 richieste al minuto).

Una volta configurata la zona, è ora di farne uso.

location { limit_req zone=foo burst=10 nodelay; //do webserver stuff }

La direttiva limit_req fa il lavoro pesante e assegna un blocco di posizione a una zona di limitazione. Il parametro burst offre al client un po' di margine di manovra e consente loro di effettuare richieste extra purché non superino in media la frequenza.

Sotto il cofano, aggiunge richieste di burst a una “coda” che ticchetta ogni 100 ms. Questo può far sembrare il tuo sito lento, quindi il parametro nodelay rimuove questo ritardo di coda. Con la configurazione attuale, se hai effettuato 10 richieste tutte in una volta, il parametro nodelay consentirebbe tutte e 10 le richieste, quindi limiterebbe la velocità delle seguenti richieste a 5 richieste al secondo. Se hai fatto altre 6 richieste, ne consentirebbero 5 e rifiuterebbero la sesta poiché è oltre il limite. Una volta che il client smette di fare richieste, la coda diminuisce a una velocità che dipende dalla tua velocità.

Limitazione della velocità a due fasi

Impostando manualmente la variabile di ritardo, è possibile consentire ad alcune richieste di non avere ritardi mentre il resto deve attendere in coda. Questo forma un limite di velocità in due fasi, in cui si desidera che le richieste iniziali siano molto veloci, le richieste di follow-up vengano leggermente rallentate, quindi si attiva il limite di velocità.

Questo viene fatto assegnando un valore di ritardo nella direttiva limit_req:

limit_req zone=ip burst=10 delay=5; Pubblicità

Qui, le prime 5 richieste arriveranno istantaneamente. Al client vengono quindi consentite altre 5 richieste ogni 100 ms fino al riempimento del burst, dopodiché sono limitate dalla variabile rate.

Rate Limitazione della larghezza di banda

La limitazione delle richieste bloccherà la maggior parte degli attacchi dannosi, ma potresti voler limitare la velocità di download in modo che gli utenti non rallentino il tuo server scaricando molti file.

< p>Puoi farlo con la direttiva limit_rate, che non ha bisogno di una zona di limitazione configurata per essa.

limit_rate 100k limit_rate_after 1m

Questo imposta la velocità massima di download a 100 Kbps dopo che è stato scaricato 1 megabyte. Tuttavia, questo viene misurato per connessione e gli utenti possono aprire più connessioni. Per risolvere questo problema, dovrai aggiungere una zona di limitazione della connessione accanto alla zona di limitazione della richiesta:

limit_conn_zone $binary_remote_address zone=bar:10m limit_req_zone $binary_remote_addr zone=foo:10m rate=5r/s;

Questo crea una zona di 10 megabyte chiamata “bar” che tiene traccia in base all'indirizzo IP. Puoi usarlo insieme a una direttiva limit_conn per abilitare la limitazione della connessione.

server { limit_conn bar 5; posizione /static/{   limit_conn bar 1; limit_rate 100k; limit_rate_dopo 1 m; } }

Poiché la maggior parte dei browser apre più connessioni durante la normale navigazione, vorremmo impostare un limite di connessione globale più alto, quindi impostare il limite su 1 connessione per il download.