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’empêcher les abus ou les attaques de certains types tels que DoS (Déni de service) attaques.
Il existe trois façons principales de limiter l’utilisation ou le trafic dans NGINX:
- Limitation du nombre de connexions (requêtes).
- Limiter le taux de demandes.
- Limitation de la bande passante.
Ce qui précède NGINX Les approches de gestion du trafic, 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
Garde en tête que NGINX considérera une connexion pour limitation uniquement si une demande est en cours de traitement par le serveur et que l’en-tête 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, en utilisant le limit_conn_zone directif. 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 valide dans le contexte HTTP prend deux paramètres : le clé et le zone (au format nom_zone:taille).
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 le limit_conn_status qui prend un code d’état HTTP en paramètre. Il est valide dans les contextes HTTP, de serveur et d’emplacement.
limit_conn_status 429;
Pour limiter les connexions, utilisez le limite_conn directive 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, de serveur et d’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.tecmint.com; root /var/www/html/testapp.tecmint.com/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 le NGINX la configuration est correcte en exécutant la commande suivante :
$ sudo nginx -t
Ensuite, rechargez le NGINX service 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 maximum de connexions autorisées, NGINX renvoie un « 429 Trop de demandes” erreur 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é en utilisant le $nom_serveur variable:
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.tecmint.com; root /var/www/html/testapp.tecmint.com/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 pour limiter le nombre total de connexions au serveur virtuel alimentant l’application testapp.tecmint.compour 2000 Connexions.
Noter: Limiter les connexions en fonction de l’adresse IP d’un client a un inconvénient. Vous risquez de restreindre les connexions de plusieurs utilisateurs, en particulier si de nombreux utilisateurs accédant à votre application se trouvent sur le même réseau et opèrent 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 liés à Nginx :
C’est tout pour le moment! Dans la prochaine partie de cette série, nous aborderons une autre technique utile de gestion du trafic dans NGINX – limiter le taux de demandes. Jusque-là, restez avec nous.
Si vous appréciez ce que nous faisons ici sur TecMint, vous devriez considérer :
TecMint est le site communautaire à la croissance la plus rapide et le plus fiable pour tout type d’articles, de guides et de livres Linux sur le Web. Des millions de personnes visitent TecMint ! pour rechercher ou parcourir les milliers d’articles publiés accessibles GRATUITEMENT à tous.
Si vous aimez ce que vous lisez, pensez à nous acheter un café (ou 2) en signe d’appréciation.
Nous sommes reconnaissants pour votre soutien sans fin.