Recherche de site Web

Comment limiter le nombre de connexions (demandes) dans NGINX


NGINX est livré avec divers modules pour permettre aux utilisateurs de contrôler le trafic vers leurs sites Web, leurs applications Web, ainsi que d’autres ressources Web. L’une des principales raisons de limiter le trafic ou l’accès est d’éviter les abus ou les attaques de certains types, tels que les attaques par déni de service (DoS).

Il existe trois façons principales de limiter l’utilisation ou le trafic dans NGINX :

  1. Limitation du nombre de connexions (requêtes).
  2. Limiter le taux de demandes.
  3. Limitation de la bande passante.

Les approches de gestion du trafic NGINX ci-dessus, en fonction du cas d’utilisation, peuvent être configurées pour être limitées en fonction d’une clé définie, la plus courante étant l’adresse IP d’un client. NGINX prend également en charge d’autres variables telles qu’un cookie de session et bien d’autres.

Dans cette première partie de notre série en trois parties, nous verrons comment limiter le nombre de connexions dans NGINX pour protéger vos sites Web/applications.

  • Comment limiter le nombre de connexions (demandes) dans NGINX - Partie 1
  • Comment limiter le taux de connexions (demandes) dans NGINX - Partie 2
  • Comment limiter l’utilisation de la bande passante dans NGINX - Partie 3

Gardez à l’esprit que NGINX ne considérera une connexion comme limitée que si une requête est traitée par le serveur et que l’en-tête entier de la demande a déjà été lu. Par conséquent, toutes les connexions client ne sont pas comptabilisées.

Limitation du nombre de connexions dans NGINX

Tout d’abord, vous devez définir une zone de mémoire partagée qui stocke les métriques de connexion pour différentes clés, à l’aide de la directive limit_conn_zone. Comme mentionné précédemment, une clé peut être un texte, une variable telle que l’adresse IP distante d’un client ou une combinaison des deux.

Cette directive qui est valable dans le contexte HTTP prend deux paramètres : la clé et la zone (au format zone_name :size).

limit_conn_zone $binary_remote_addr zone=limitconnbyaddr:20m;

Pour définir un code d’état de réponse qui est renvoyé aux demandes rejetées, utilisez la directive limit_conn_status qui prend un code d’état HTTP comme paramètre. Il est valide dans les contextes HTTP, de serveur et d’emplacement.

limit_conn_status 429;

Pour limiter les connexions, utilisez la directive limint_conn pour définir la zone de mémoire à utiliser et le nombre maximal de connexions autorisées, comme indiqué dans l’extrait de configuration suivant. Cette directive est valide dans les contextes HTTP, serveur et emplacement.

limit_conn   limitconnbyaddr  50;

Voici la configuration complète :

upstream api_service {
    server 127.0.0.1:9051;
    server 10.1.1.77:9052;
}
limit_conn_zone $binary_remote_addr zone=limitconnbyaddr:20m;
limit_conn_status 429;

server {
    listen 80;
    server_name testapp.linux-console.net;
    root /var/www/html/testapp.linux-console.net/build;
    index index.html;

    limit_conn   limitconnbyaddr  50;

    #include snippets/error_pages.conf;
    proxy_read_timeout 600;
    proxy_connect_timeout 600;
    proxy_send_timeout 600;
    location / {
        try_files $uri $uri/ /index.html =404 =403 =500;
    }
    location /api {
        proxy_pass http://api_service;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
   }
}

Enregistrez le fichier et fermez-le.

Vérifiez ensuite si la configuration NGINX est correcte en exécutant la commande suivante :

$ sudo nginx -t

Ensuite, rechargez le service NGINX pour effectuer les modifications récentes :

$ sudo systemctl reload nginx

Vérification de la limite de connexion Nginx

Lorsqu’un client dépasse le nombre maximal de connexions autorisées, NGINX renvoie une erreur « 429 Trop de requêtes » au client et enregistre une entrée telle que celle ci-dessous dans le fichier journal des erreurs :

2022/03/15 00:14:00 [error] 597443#0: *127 limiting connections by zone "limitconnbyaddr", client: x.x.x.x, server: testapp.tecmimt.com, request: "GET /static/css/main.63fdefff.chunk.css.map HTTP/1.1", host: "testapp.tecmimt.com"

Limitation du nombre de connexions Nginx à l’application

Vous pouvez également limiter le nombre de connexions pour un serveur donné à l’aide de la variable $server_name :

upstream api_service {
    server 127.0.0.1:9051;
    server 10.1.1.77:9052;
}
limit_conn_zone $server_name zone=limitbyservers:10m;
limit_conn_status 429;

server {
    listen 80;
    server_name testapp.linux-console.net;
    root /var/www/html/testapp.linux-console.net/build;
    index index.html;

     limit_conn  limitbyservers  2000;

    #include snippets/error_pages.conf;
    proxy_read_timeout 600;
    proxy_connect_timeout 600;
    proxy_send_timeout 600;
    location / {
        try_files $uri $uri/ /index.html =404 =403 =500;
    }
    location /api {
        proxy_pass http://api_service;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
   }
}

Cette configuration permet à NGINX de limiter le nombre total de connexions au serveur virtuel alimentant l’application testapp.linux-console.net à 2000 connexions.

Remarque : Limiter les connexions en fonction de l’adresse IP d’un client présente un inconvénient. Vous risquez de restreindre les connexions pour plus d’un utilisateur, en particulier si de nombreux utilisateurs accédant à votre application se trouvent sur le même réseau et fonctionnent derrière un NAT : toutes leurs connexions proviendront de la même adresse IP.

Dans un tel scénario, vous pouvez utiliser une ou plusieurs variables disponibles dans NGINX qui peuvent identifier un client au niveau de l’application, par exemple un cookie de session.

Vous pourriez également aimer les articles suivants liés à Nginx :

  • Comment créer une page d’erreur 404 personnalisée dans NGINX
  • Comment contrôler l’accès en fonction de l’adresse IP du client dans NGINX
  • Comment mettre en cache du contenu dans NGINX
  • Comment activer HTTP/2.0 dans Nginx
  • Comment utiliser Nginx comme équilibreur de charge HTTP sous Linux

C’est tout pour l’instant ! Dans la prochaine partie de cette série, nous aborderons une autre technique utile de gestion du trafic dans NGINX : la limitation du taux de demandes. D’ici là, restez avec nous.

Articles connexes: