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, applications Web, ainsi que d'autres ressources Web. L'une des principales raisons de limiter le trafic ou l'accès est de prévenir les abus ou les attaques de certains types, telles que les attaques DoS (Denial of Service).

Il existe trois manières 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. Limiter la bande passante.

Les approches de gestion du trafic NGINX ci-dessus, selon le cas d'utilisation, peuvent être configurées pour limiter 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 (requêtes) dans NGINX – Partie 1
  • Comment limiter le taux de connexions (requêtes) dans NGINX – Partie 2
  • Comment limiter l'utilisation de la bande passante dans NGINX – Partie 3

Gardez à l'esprit que NGINX prendra en compte une connexion à limiter uniquement si une requête est en cours de traitement par le serveur et que l'intégralité de l'en-tête de la requête a déjà été lue. Par conséquent, toutes les connexions client ne sont pas prises en compte.

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 valable dans le contexte HTTP prend deux paramètres : la key 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 requêtes 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 mémoire à utiliser et le nombre maximum 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 de NGINX est correcte en exécutant la commande suivante :

sudo nginx -t

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

sudo systemctl reload nginx

Vérification de la limite de connexion Nginx

Lorsqu'un client dépasse le nombre maximum de connexions autorisées, NGINX renvoie une erreur « 429 Trop de demandes » au client et enregistre une entrée telle que celle ci-dessous dans l'erreur fichier journal:

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"

Limiter le nombre de connexions Nginx à l'application

Vous pouvez également limiter le nombre de connexions pour un serveur donné en utilisant 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 : La limitation des connexions en fonction de l'adresse IP d'un client présente un inconvénient. Vous pourriez finir par restreindre les connexions de plusieurs utilisateurs, surtout 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, un exemple est un cookie de session.

Vous pourriez également aimer les articles suivants sur 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 le contenu dans NGINX
  • Comment activer HTTP/2.0 dans Nginx
  • Comment utiliser Nginx comme équilibreur de charge HTTP sous Linux

C'est tout pour le moment! Dans la prochaine partie de cette série, nous aborderons une autre technique de gestion du trafic utile dans NGINX : limiter le taux de requêtes. En attendant, restez avec nous.