Nginx · 2 min read · Jan 23, 2026

Limitazione della velocità con nginx

Questo articolo spiega come utilizzare il modulo HttpLimitReqModule di nginx per limitare il numero di richieste per una determinata sessione. Questo è utile, ad esempio, se il tuo sito è bersagliato da un bot che effettua più richieste al secondo, aumentando così il carico del tuo server. Con il modulo ngx_http_limit_req_module, puoi definire un limite di velocità e, se un visitatore supera questo limite, riceverà un errore 503.

1 Utilizzo del modulo HttpLimitReqModule (ngx_http_limit_req_module)

Apri il tuo nginx.conf…

nano /etc/nginx/nginx.conf

… e definisci un’area in cui vengono memorizzati gli stati delle sessioni - questo deve andare all’interno del contenitore http {}:

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

Questa area si chiama one ed è allocata 10MB di spazio. Invece della variabile $remote_addr, utilizziamo la variabile $binary_remote_addr che riduce la dimensione dello stato a 64 byte. Ci possono essere circa 16.000 stati in una zona da 1MB, quindi 10MB consentono circa 160.000 stati, quindi questo dovrebbe essere sufficiente per i tuoi visitatori. La velocità è limitata a una richiesta al secondo. Si prega di notare che è necessario utilizzare valori interi qui, quindi se desideri impostare il limite a metà richiesta al secondo, utilizzeresti 30r/m (30 richieste al minuto).

Per mettere in funzione questo limite, utilizziamo la direttiva limit_req. Puoi utilizzare questa direttiva nei contenitori http {}, server {}, e location {}, ma a mio avviso è più utile nei contenitori location {} che passano le richieste ai tuoi server applicativi (PHP-FPM, mongrel, ecc.) perché altrimenti, se carichi una singola pagina con molte immagini, file CSS e JavaScript, probabilmente supereresti il limite di velocità dato con una singola richiesta di pagina.

Quindi mettiamo questo 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=one burst=5; specifica che questo limite di velocità appartiene all’area di memorizzazione delle sessioni che abbiamo definito prima (a causa di zone=one) il che significa che il limite di velocità è 1r/s. Puoi immaginare il significato di burst come una sorta di coda. Significa che se superi il limite di velocità, le richieste successive vengono ritardate, e solo se hai più richieste in attesa nella coda di quelle specificate nel parametro burst, riceverai un errore 503 (ad esempio, così:

Limitazione della velocità di Nginx applicata.

).

Se non vuoi utilizzare questa coda (cioè fornire immediatamente un 503 se qualcuno supera il limite di velocità), devi 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 tue modifiche:

service nginx reload

2 Link

Informazioni sull’autore

Falko Timme è il proprietario di Timme Hosting (hosting web nginx ultra-veloce). È il principale manutentore di HowtoForge (dal 2005) e uno dei core developer di ISPConfig (dal 2000). Ha anche contribuito al libro di O’Reilly “Linux System Administration”.

Share: X/Twitter LinkedIn

Ricevi i nuovi post nella tua casella di posta.

Nessuno spam. Disiscriviti in qualsiasi momento.