Le tuto nginx est plutôt « léger » sur l’explication concrète de cette configuration de limitation, voici donc quelques compléments d’explication :
geo $limit {
default 1;
10.0.0.0/8 0;
192.168.0.0/24 0;
}
map $limit $limit_key {
0 "";
1 $binary_remote_addr;
}
limit_req_zone $limit_key zone=req_zone:10m rate=5r/s;
server {
location / {
limit_req zone=req_zone burst=10 nodelay;
# ...
}
}
L’instruction geo
créé un variable $limit qui aura pour valeur 0 ou 1 en fonction de l’adresse IP du client. Ici les 2 réseaux privés 10.0… et 192.168.. vont valoriser la variable $limit avec un 0, sinon $limit sera valorisée à 1.
L’instruction map
va définir une variable $limit_key, sa valeur va dépendre de la valeur de la variable $limit. Si geo
a identifié une IP publique, $limit contiendra 1, donc $limit_key sera valorisé à « $binary_remote_addr se qui va entraîner l’instruction limit_req_zone
à s’appliquer sur l’IP du client. Si le client a une IP privée dans ce cas $limit_key sera valorisé à zéro et l’instruction limit_req_zone
ne va pas s’exécuter.
La balise limit_req_zone
applique une limitation à 5 requêtes par seconde si $limit_key
est valorisé à 1.
Dans l’instruction limit_req
, un burst
(un bonus) de 10 est ajouté. Le nodelay
va amener des réponses 503 à partir de la requête 16 si elles arrivent dans la même seconde. En supprimant le nodelay, le navigateur affichera une page qui se charge lentement.
Les liens vers le détail technique des commandes :