Ricerca nel sito web

Limitazione della velocità con Nginx


Su questa pagina

  1. 1 Utilizzo di HttpLimitReqModule
  2.  2 link

Questo articolo spiega come utilizzare nginx HttpLimitReqModule per limitare il numero di richieste per una determinata sessione. Ciò è utile, ad esempio, se il tuo sito viene martellato da un bot che esegue più richieste al secondo e quindi aumenta il carico del tuo server. Con HttpLimitReqModule puoi definire un limite di frequenza e se un visitatore supera questa frequenza, riceverà un errore 503.

1 Utilizzo di HttpLimitReqModule

Apri il tuo nginx.conf...

nano /etc/nginx/nginx.conf

... e definisci un'area in cui sono memorizzati gli stati della sessione - questo deve andare all'interno del contenitore http {}:

http {
    [...]
    limit_req_zone  $binary_remote_addr  zone=one:10m   rate=1r/s;
    [...]
}

Quest'area è chiamata uno e dispone di 10 MB di spazio di archiviazione. Invece della variabile $remote_addr, usiamo la variabile $binary_remote_addr che riduce la dimensione dello stato a 64 byte. Possono esserci circa 16.000 stati in una zona da 1 MB, quindi 10 MB consentono circa 160.000 stati, quindi questo dovrebbe essere sufficiente per i tuoi visitatori. La tariffa è limitata a una richiesta al secondo. Tieni presente che qui devi utilizzare valori interi, quindi se desideri impostare il limite a metà richiesta al secondo, devi utilizzare 30r/m (30 richieste al minuto).

Per far funzionare questo limite, usiamo la direttiva limit_req. Puoi utilizzare questa direttiva nei contenitori http {}, server {} e location {}, ma secondo me è più utile nei contenitori location {} che trasmettono le richieste ai tuoi server delle applicazioni (PHP-FPM, mongrel, ecc. ) perché altrimenti, se carichi una singola pagina con molti file di immagini, CSS e JavaScript, probabilmente supereresti il limite di velocità specificato con una singola richiesta di pagina.

Quindi mettiamolo in un contenitore location ~ \.php${}:

[...]
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
                limit_req zone=one burst=5;
        }
[...]

limit_req zone=una raffica=5; specifica che questo limite di frequenza appartiene all'area di archiviazione della sessione definita in precedenza (a causa di zone=one), il che significa che il limite di frequenza è 1r/s. Puoi immaginare il significato dell'opzione burst come una specie di coda. Significa che se superi il limite di velocità, le seguenti richieste vengono ritardate e solo se hai più richieste in attesa in coda di quelle specificate nel parametro burst, riceverai un errore 503 (ad esempio come questo:

).

Se non si desidera utilizzare questa coda (ovvero inviare immediatamente un 503 se qualcuno supera il limite di velocità), è necessario utilizzare l'opzione nodelay:

[...]
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
                limit_req zone=one burst=5 nodelay;
        }
[...]

Non dimenticare di ricaricare nginx per rendere effettive le modifiche:

systemctl nginx reload

2 collegamenti

  • nginx: https://nginx.org/
  • HttpLimitReqModule: