Limitazione della velocità con Nginx
Su questa pagina
- 1 Utilizzo di HttpLimitReqModule
- 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: