Comment limiter le taux de connexions (demandes) dans Nginx

Comment limiter le taux de connexions (demandes) dans Nginx

Dans notre dernier article qui fait partie de notre série de gestion du trafic Nginx, nous avons discuté de la façon de limiter le nombre de connexions dans Nginx. Dans ce guide, nous examinerons comment limiter le taux de demandes dans Nginx.

La limitation des taux est une technique de gestion du trafic utilisée pour restreindre le nombre de Http demande qu'un client peut faire dans une période de temps donnée - les limites de taux sont calculées dans Demandes par seconde (ou RPS).

Un exemple de demande est un OBTENIR demande de page de connexion d'une application ou d'un POSTE demande sur un formulaire de connexion ou un POSTE sur un API point final.

Il existe de nombreuses raisons de limiter le taux de demandes à vos applications Web ou aux services d'API, l'une étant la sécurité: Protection contre les demandes rapides abusives.

Taux de connexions limitantes dans Nginx

Commencez par définir les paramètres de limitation de taux en utilisant limit_req_zone directif. Les paramètres requis sont une clé pour identifier les clients, une zone de mémoire partagée qui stockera l'état de la clé et la fréquence.

Le limit_req_zone La directive est valable dans le contexte HTTP.

limit_req_zone $ binary_remote_addr zone = limiteqsbyaddr: 20m rate = 10r / s; 

Définissez également un code d'état de réponse qui est renvoyé aux demandes rejetées, en utilisant le limit_req_status Directive qui est valide dans les contextes HTTP, Sévaluer et Location.

limit_req_status 429; 

Maintenant vous pouvez utiliser le limint_conn Directive pour permettre la limite de taux de demande dans les contextes HTTP, Sever et Location. Il prend une zone de mémoire comme paramètre et autres paramètres facultatifs.

limit_req Zone = limitReqsByAddr; 

L'exemple de configuration suivant montre la limitation du taux de demande à une API d'application Web. La taille de la mémoire partagée est de 20 Mo et la limite de taux de demande est de 10 demandes par seconde.

API_SERVICE en amont serveur 127.0.0.1: 9051; serveur 10.1.1.77: 9052;  limit_req_zone $ binary_remote_addr zone = limiteqsbyaddr: 20m rate = 10r / s; limit_req_status 429; Server écouter 80; server_name testapp.Tecmint.com; root / var / www / html / testapp.Tecmint.com / build; Index index.html; #include Snippets / Error_Pages.conf; proxy_read_timeout 600; proxy_connect_timeout 600; proxy_send_timeout 600; Emplacement / try_files $ uri $ uri / / index.html = 404 = 403 = 500;  Emplacement / API  limit_req Zone = limitReqsByAddr; 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 mise à niveau $ http_upgrade; proxy_set_header connection "mise à niveau";  

Enregistrez votre fichier de configuration et fermez-le.

Alors vérifiez si le Nginx La syntaxe de configuration est correcte en utilisant la commande suivante:

$ sudo nginx -t 

Après cela, recharger le Nginx Le service applique les derniers modifications:

$ sudo systemctl recharger nginx 

Une fois la limite de taux de dix Les demandes par seconde sont dépassées par un seul client accès à / api /, Nginx renvoie un "429 trop de demandes”Erreur au client.

Nginx 429 Trop de demandes d'erreur

Il enregistre également l'incident dans le journal d'erreur.

2022/04/29 00:30:38 [ERREUR] 3145846 # 0: * 131039 Demandes de limitation, excès: 0.990 par zone "limitReqsbyAddr", client: 192.168.1.10, serveur: testapp.Tecmint.com, demande: "get / api / v1 / app / meta-data http / 1.1 ", Hôte:" TestApp.Tecmint.com ", référence:" https: // testApp.Tecmint.com / " 
Journaux d'erreur Nginx

Parfois, en fonction de la nature de votre application ou de votre API, un client devra faire de nombreuses demandes en même temps, puis réduire son taux pendant une période avant de faire plus. Nginx peut également tamponner toutes les demandes excédentaires dans une file d'attente et les traiter rapidement.

Vous pouvez activer ce comportement en limitation de taux en utilisant le éclatement paramètre avec le limit_req directif. Pour activer la file d'attente sans délai, ajoutez le sans délais paramètre.

limit_req Zone = limiteqsbyaddr burst = 20 nodelay; 

Il y a un accroc avec une limitation de taux en fonction de l'IP d'un client, en particulier pour les utilisateurs qui accédaient à votre application à partir du même réseau et fonctionnant derrière un NAT. Dans ce cas, toutes leurs demandes proviendront de la même adresse IP. Dans un tel scénario, vous pouvez utiliser d'autres variables pour identifier des clients tels qu'un cookie de session.

Pour plus d'informations sur la limitation du taux des demandes, consultez cette limitation de taux Nginx sur le site Web de Nginx. Ensuite, nous couvrirons comment limiter l'utilisation de la bande passante dans Nginx.