Comment utiliser la limitation de débit sur Nginx

0
191

La limitation du débit contrôle le nombre de requêtes que les utilisateurs peuvent effectuer sur votre site. Ceci est généralement mis en place pour arrêter les bots abusifs, limiter les tentatives de connexion et contrôler l'utilisation de l'API, ce qui peut empêcher votre serveur de ralentir sous la charge.

La limitation du débit ne peut pas toujours vous éviter d'énormes les pics de trafic, donc si votre serveur a vraiment besoin d'une protection, il est recommandé de configurer un CDN de site complet en amont, ou au moins de configurer l'équilibrage de charge HAProxy pour répartir la charge sur plusieurs serveurs.

Comment activer la limitation de débit dans Nginx

Tout d'abord, nous devons définir une “zone.” Vous pouvez configurer plusieurs zones et attribuer différents blocs d'emplacements à chaque zone. Pour l'instant, créons une zone de base en ajoutant la ligne suivante à votre serveur ou bloc de contexte http :

limit_req_zone $binary_remote_addr zone=foo:10m rate=5r/s;

La commande limit_req_zone définit une zone en utilisant $binar_remote_addr comme identifiant. Il s'agit de l'adresse IP du client, mais vous pouvez également utiliser quelque chose comme $server_name pour la limiter par serveur.

L'indicateur de zone nomme la zone (dans ce cas, “foo”) et alloue un bloc de mémoire à la zone. Nginx doit stocker les adresses IP à vérifier, il a donc besoin de mémoire pour chaque zone. Dans ce cas, 10 m alloue 10 Mo de mémoire, suffisamment pour 160 000 connexions par seconde (ce que vous ne verrez probablement jamais sur un seul serveur).

Publicité

Le dernier indicateur est le taux, qui définit le nombre de connexions par défaut autorisé pour chaque client. Ici, il est défini sur 5 requêtes par seconde, 10 étant le maximum, mais vous pouvez le définir plus lentement en le formatant à 30 r/m (pour 30 requêtes par minute).

Une fois la zone configurée, il est temps de l'utiliser.

location { limit_req zone=foo burst=10 nodelay; //do webserver stuff }

La directive limit_req fait le gros du travail et attribue un bloc d'emplacement à une zone de limitation. Le paramètre de rafale donne au client une certaine marge de manœuvre et lui permet de faire des demandes supplémentaires tant qu'elles ne dépassent pas le taux moyen.

Sous le capot, il ajoute des demandes de rafale à une “file d'attente” qui baisse toutes les 100 ms. Cela peut donner l'impression que votre site est lent. Le paramètre nodelay supprime donc ce délai de file d'attente. Avec la configuration actuelle, si vous effectuez 10 requêtes en même temps, le paramètre nodelay autorise les 10 requêtes, puis limite les requêtes suivantes à 5 requêtes par seconde. Si vous faites 6 demandes supplémentaires, cela en autorisera 5 et rejettera la 6ème car elle dépasse la limite. Une fois que le client arrête de faire des demandes, la file d'attente diminue à une vitesse en fonction de votre taux.

Limitation de débit en deux étapes

En définissant manuellement la variable de délai, il est possible de permettre à quelques requêtes de n'avoir aucun délai tandis que les autres doivent attendre dans la file d'attente. Cela forme une limite de débit en deux étapes, où vous voulez que les requêtes initiales soient très rapides, que les requêtes de suivi soient un peu ralenties, puis lancez la limite de débit.

Cela se fait en attribuant un valeur de délai sur la directive limit_req :

limit_req zone=ip burst=10 délai=5 ; Publicité

Ici, les 5 premières demandes arriveront instantanément. Le client est ensuite autorisé à 5 requêtes supplémentaires toutes les 100 ms jusqu'à ce que la rafale se remplisse, après quoi, elles sont limitées par la variable de taux.

Taux Limitation de la bande passante

La limitation des requêtes bloquera la plupart des attaques malveillantes, mais vous voudrez peut-être limiter la vitesse de téléchargement afin que les utilisateurs ne ralentissent pas votre serveur en téléchargeant beaucoup de fichiers.

< p>Vous pouvez le faire avec la directive limit_rate, qui n'a pas besoin d'une zone de limitation configurée pour cela.

limit_rate 100k limit_rate_after 1m

Cela définit la vitesse de téléchargement maximale à 100 Kbps après le téléchargement de 1 mégaoctet. Cependant, cela est mesuré par connexion et les utilisateurs peuvent ouvrir plusieurs connexions. Pour résoudre ce problème, vous devrez ajouter une zone de limitation de connexion à côté de la zone de limitation de demande :

limit_conn_zone $binary_remote_address zone=bar:10m limit_req_zone $binary_remote_addr zone=foo:10m rate=5r/s ;

Cela crée une zone de 10 mégaoctets appelée “bar” qui suit en fonction de l'adresse IP. Vous pouvez l'utiliser avec une directive limit_conn pour activer la limitation de connexion.

server { limit_conn bar 5; location /static/{   limit_conn bar 1; limite_taux 100k ; limit_rate_after 1m; } }

Étant donné que la plupart des navigateurs ouvrent plusieurs connexions lors d'une navigation normale, nous souhaitons augmenter la limite de connexion globale, puis définir la limite à 1 connexion pour le téléchargement.