Recherche de site Web

Comment limiter la bande passante réseau dans le serveur Web NGINX


Précédemment, dans notre série sur la gestion du trafic et les contrôles de sécurité NGINX, nous avons expliqué comment limiter le nombre de connexions qu’un même client peut établir à vos ressources Web, à l’aide de paramètres d’identification du client tels que l’adresse IP. Nous avons également abordé la façon de limiter le taux de requêtes (limiter le taux auquel un client peut faire des requêtes) pour vos ressources Web.

Pour vous assurer que la bande passante d’utilisation de votre application n’est pas dépensée par un seul client, vous devez contrôler les vitesses de chargement et de téléchargement par client. Il s’agit d’un contrôle de sécurité NGINX courant contre les attaques DoS (Denial of Service) d’utilisateurs malveillants qui essaient simplement d’abuser des performances du site.

Dans cette troisième partie de la série, nous allons expliquer comment limiter la bande passante réseau dans le serveur web NGINX.

Limitation de la bande passante dans NGINX

Pour limiter la bande passante dans NGINX, utilisez la directive limit_rate qui limite le taux de transmission de la réponse à un client. Il est valide dans l’instruction HTTP, server, location et if au sein d’un bloc d’emplacement, et il spécifie la limite de débit pour un contexte donné en octets par seconde par défaut. Vous pouvez également utiliser m pour mégaoctets ou g pour gigaoctets.

limit_rate 20k;

Une autre directive connexe est la limit_rate_after, qui spécifie que la connexion ne doit pas être limitée en débit tant qu’une quantité spécifiée de données n’a pas été transférée. Cette directive peut être définie dans l’instruction HTTP, serveur, emplacement et « if dans un bloc d’emplacement ».

limit_rate_after 500k;

Voici un exemple de configuration pour limiter un client au téléchargement de contenu via une seule connexion à une vitesse maximale de 20 kilo-octets par seconde.

upstream api_service {
    server 10.1.1.10:9051;
    server 10.1.1.77:9052;
}

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

    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";

       
   }
   location /documents {
        limit_rate 20k;
        limit_rate_after 500k;  
}
}

Une fois que vous avez ajouté les paramètres requis expliqués ci-dessus, enregistrez les modifications et fermez le fichier. Ensuite, vérifiez si la syntaxe de configuration NGINX est correcte, comme ceci :

$ sudo nginx -t

Si tout est OK, rechargez le service NGINX pour effectuer les dernières modifications :

$ sudo systemctl reload nginx

Limitation de la bande passante et du nombre de connexions dans NGINX

Avec la configuration ci-dessus, le client peut ouvrir plusieurs connexions pour augmenter la bande passante. Par conséquent, vous pouvez également limiter les connexions par client à l’aide d’un paramètre tel qu’une adresse IP, comme nous l’avons vu précédemment.

Par exemple, vous pouvez limiter une connexion par adresse IP.

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;

    location / {
        try_files $uri $uri/ /index.html =404 =403 =500;
    }
    location /api {
        limit_conn   limitconnbyaddr  5;

        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";

       
   }
   location  /documents {
        limit_rate 50k;
        limit_rate_after 500k;  
        limit_conn   limitconnbyaddr  1;
}
}

Limitation dynamique de la bande passante dans NGINX

En tant que valeur de paramètre de la directive limit_rate, vous pouvez spécifier des variables pour limiter dynamiquement la bande passante. Il est particulièrement utile dans les situations où le taux devrait être limité en fonction d’une certaine condition.

Dans cet exemple, nous utilisons le bloc carte. Il vous a permis de créer une nouvelle variable dont la valeur dépend des valeurs d’une ou plusieurs des variables d’origine ($slow et $limit_rate) spécifiées dans le premier paramètre.

upstream api_service {
    server 10.1.1.10:9051;
    server 10.1.1.77:9052;
}

map $slow $limit_rate {
    1     20k;
    2     30k;
}

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

    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";
   }
   location /documents {
        limit_rate $limit_rate;
        limit_rate_after 500k;
}
}

Voici un autre exemple de configuration pour illustrer la limitation dynamique de la bande passante dans NGINX. Cette configuration permet à NGINX de limiter la bande passante en fonction de la version TLS. La directive limit_rate_after 512 implique le taux limite après l’envoi des en-têtes.

upstream api_service {
    server 10.1.1.10:9051;
    server 10.1.1.77:9052;
}

map $ssl_protocol $response_rate {
    "TLSv1.1" 50k;
    "TLSv1.2" 100k;
    "TLSv1.3" 500k;
}

server {
    listen 443 ssl;
    ssl_protocols       TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_certificate     /etc/ssl/testapp.crt;
    ssl_certificate_key   /etc/ssl/testapp.key;

    location / {
        limit_rate       $response_rate; # Limit bandwidth based on TLS version
        limit_rate_after 512;
        proxy_pass       http://api_service;
    }
}

C’est tout ce que nous avions pour vous dans cette partie de la série. Nous continuerons à couvrir d’autres sujets concernant la gestion du trafic NGINX et les contrôles de sécurité. Mais comme d’habitude, vous pouvez poser des questions ou partager vos réflexions sur ce guide via le formulaire de commentaires ci-dessous.

Articles connexes: