NGINX - demandes de limitation pour éviter les abus

28

La raison pour laquelle je veux le faire est que les utilisateurs développent contre notre API avec JavaScript, et certains développeurs bousillent et amènent les visiteurs à claquer le serveur avec des requêtes AJAX. Lorsque cela se produit, je veux pouvoir limiter les demandes d'API à peut-être 50 demandes par minute , ou quelque chose dans ce sens.

Remarque: (en particulier les ressources intensives en bases de données, donc peut-être au niveau du chemin, plutôt qu'à l'échelle du serveur (par exemple, accélérateur "/ json_api /", mais pas "/ statique /").

orokusaki
la source

Réponses:

36

Cela peut être fait en utilisant le LimitReqModule avec Nginx. Cependant, s'il s'agit d'un proxy inverse, vous voudrez peut-être essayer la nouvelle limitation de débit prise en charge par HAProxy .

J'ai trouvé que la limitation du taux nginx était un peu déroutante pour obtenir le taux exact que vous souhaitez.

Mais vous avez essentiellement quelque chose comme:

limit_req_zone  $binary_remote_addr  zone=default:10m   rate=50r/m;

dans la httpsection, puis quelque chose comme ce qui suit dans la locationsection de la serversection:

limit_req zone=default burst=10 nodelay;

Afin de ne pas l'avoir pour une certaine section comme /staticvous le feriez simplement en un séparé locationet ne l'incluez pas la limit_reqdirective (ou l'inverse).

Kyle Brandt
la source
Merci. Pouvez-vous expliquer ce que ces choses font (zone, éclatement, nodelay)? Et, vouliez-vous mettre zone=limit_req_zone, à la place?
orokusaki
Honnêtement, je ne peux pas bien les expliquer, c'est pourquoi je pense que c'est juste déroutant. L'explication de Michael dans le lien que j'ai fourni semble être réalisable. Je ne pense pas avoir de fautes de frappe en ce qui concerne votre deuxième question ... La documentation du module auquel j'ai lié a un exemple qui pourrait aider.
Kyle Brandt
2
zone, burst et nodelay sont documentés sur la page wiki Nginx sur le module de limitation de débit , lié à déjà de la réponse ci-dessus.
Mark Stosberg
Kyle, savez-vous s'il existe un moyen de combiner la limite de taux par emplacement avec un autre déclencheur (par exemple, Authorization-Header). Dans mon cas, je veux peut-être limiter le taux d'un utilisateur spécifique.
Nils
1
@Nils AFAICS, vous pouvez utiliser la $http_authorizationvariable pour définir une nouvelle zone où la clé est un tel en-tête plutôt que l'adresse IP, c'est-à-dire, limit_req_zone $http_authorization zone = per_user : 10m rate = 5r/spuis utiliser la per_userzone dans les sections d'emplacement où vous souhaitez faire la limitation de taux par utilisateur. Non testé, je viens de lire la documentation et la liste des variables nginx ... faites-moi savoir si vous essayez ceci!
idrarig