Nginx · 2 min read · Oct 11, 2025

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 HttpLimitReqModule, vous pouvez définir une limite de taux, et si un visiteur dépasse ce taux, il recevra une erreur 503.

1 Utilisation du HttpLimitReqModule

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 permet 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 l’option 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 :

systemctl nginx reload

2 Liens

Share: X/Twitter LinkedIn

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

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