Nginx · 2 min read · Jan 23, 2026

Limitation de Taux avec nginx

Cet article explique comment utiliser le module HttpLimitReqModule de nginx pour limiter le nombre de requêtes pour une session donnée. Cela est utile, par exemple, si votre site est attaqué par un bot effectuant plusieurs requêtes par seconde et augmentant ainsi la charge de votre serveur. Avec le module ngx_http_limit_req_module, vous pouvez définir une limite de taux, et si un visiteur dépasse cette limite, il recevra une erreur 503.

1 Utilisation du HttpLimitReqModule (ngx_http_limit_req_module)

Ouvrez votre nginx.conf…

nano /etc/nginx/nginx.conf

… et définissez une zone où les états de session sont stockés - cela doit se faire à l’intérieur du conteneur http {} :

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

Cette zone s’appelle one et est allouée 10 Mo de stockage. Au lieu de la variable $remote_addr, nous utilisons la variable $binary_remote_addr qui réduit la taille de l’état à 64 octets. Il peut y avoir environ 16 000 états dans une zone de 1 Mo, donc 10 Mo permettent d’avoir environ 160 000 états, ce qui devrait suffire pour vos visiteurs. Le taux est limité à une requête par seconde. Veuillez noter que vous devez utiliser des valeurs entières ici, donc si vous souhaitez définir la limite à une demi-requête par seconde, vous utiliseriez 30r/m (30 requêtes par minute).

Pour mettre cette limite en œuvre, nous utilisons la directive limit_req. Vous pouvez utiliser cette directive dans les conteneurs http {}, server {}, et location {}, mais à mon avis, elle est la plus utile dans les conteneurs location {} qui transmettent des requêtes à vos serveurs d’application (PHP-FPM, mongrel, etc.) car sinon, si vous chargez une seule page avec beaucoup d’images, de fichiers CSS et JavaScript, vous dépasseriez probablement la limite de taux donnée avec une seule requête de page.

Alors mettons cela dans un conteneur 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; spécifie que cette limite de taux appartient à la zone de stockage de session que nous avons définie précédemment (à cause de zone=one) ce qui signifie que la limite de taux est de 1r/s. Vous pouvez imaginer la signification de burst comme une sorte de file d’attente. Cela signifie que si vous dépassez la limite de taux, les requêtes suivantes sont retardées, et seulement si vous avez plus de requêtes en attente dans la file d’attente que spécifié dans le paramètre burst, vous recevrez une erreur 503 (par exemple, comme ceci :

Limite de taux Nginx appliquée.

).

Si vous ne souhaitez pas utiliser cette file d’attente (c’est-à-dire livrer un 503 immédiatement si quelqu’un dépasse la limite de taux), vous devez utiliser l’option 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;
        }
[...]

N’oubliez pas de recharger nginx pour que vos modifications prennent effet :

service nginx reload

2 Liens

À propos de l’Auteur

Falko Timme est le propriétaire de Timme Hosting (hébergement web nginx ultra-rapide). Il est le principal responsable de HowtoForge (depuis 2005) et l’un des développeurs principaux d’ISPConfig (depuis 2000). Il a également contribué au livre O’Reilly “Administration Système Linux”.

Share: X/Twitter LinkedIn

Recevez de nouveaux articles dans votre boîte de réception.

Aucun spam. Désabonnez-vous à tout moment.