Agence web » Actualités du digital » Comment utiliser la limitation de débit sur Nginx

Comment utiliser la limitation de débit sur Nginx

La limitation de débit contrôle le nombre de demandes que les utilisateurs peuvent adresser à 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 de débit ne peut pas toujours vous éviter des pics de trafic massifs. Par conséquent, si votre serveur a vraiment besoin de protection, il est recommandé de configurer un CDN de site complet en amont, ou du 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» de limitation de débit. Vous pouvez configurer plusieurs zones et attribuer des blocs d'emplacements différents à chaque zone. Pour l'instant, créons une zone de base en ajoutant la ligne suivante à votre server ou http bloc de contexte:

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

le limit_req_zone commande 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 le limiter par serveur.

le zone flag nomme la zone (dans ce cas, «foo») et alloue un bloc de mémoire à la zone. Nginx a besoin de stocker les adresses IP à vérifier, il a donc besoin de mémoire pour chaque zone. Dans ce cas, 10m alloue 10 mégaoctets de mémoire, assez pour 160 000 connexions par seconde (ce que vous ne verrez probablement jamais sur un seul serveur).

L'indicateur final est le taux, qui définit le nombre par défaut de connexions que chaque client est autorisé. Ici, il est défini sur 5 requêtes par seconde, 10 étant le maximum, bien que vous puissiez le définir plus lentement en le formatant comme 30r/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
}

le limit_req directive s'occupe du gros du travail et attribue un bloc d'emplacement à une zone de limitation. le burst Le paramètre donne au client une certaine marge de manœuvre et lui permet de faire des demandes supplémentaires à condition de ne pas dépasser le taux en moyenne.

Sous le capot, il ajoute des requêtes en rafale à une «file d'attente» qui s'active toutes les 100 ms. Cela peut rendre votre site lent, de sorte que le nodelay Le paramètre supprime ce délai de file d'attente. Avec la configuration actuelle, si vous avez fait 10 requêtes en même temps, le nodelay Le paramètre autoriserait les 10 demandes, puis limiterait le débit des demandes suivantes à 5 demandes par seconde. Si vous faites 6 demandes supplémentaires, cela en autorise 5 et rejette la 6ème car elle dépasse la limite. Une fois que le client arrête de faire des demandes, la file d'attente ralentit à 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 demandes d’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 demandes initiales soient très rapides, que les demandes de suivi soient un peu ralenties, puis que vous atteignez la limite de débit.

Cela se fait en attribuant une valeur de retard au limit_req directif:

limit_req zone=ip burst=10 delay=5;

Ici, les 5 premières demandes seront traitées instantanément. Le client a ensuite droit à 5 demandes supplémentaires toutes les 100 ms jusqu'à ce que la rafale se remplisse, après quoi, elles sont limitées par la variable de débit.

Limitation de la bande passante

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

Vous pouvez le faire avec le limit_rate directive, 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 1 mégaoctet a été téléchargé. Cependant, cela est mesuré par connexion et les utilisateurs peuvent ouvrir plusieurs connexions. Pour résoudre ce problème, vous devez 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 fait une zone de 10 mégaoctets appelée «barre» qui suit en fonction de l'adresse IP. Vous pouvez l'utiliser avec un limit_conn directive pour activer la limitation de connexion.

server {

  limit_conn bar 5;

  location /static/ {
    limit_conn bar 1;
    limit_rate 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 sur 1 connexion pour le téléchargement.

★★★★★