Avec le module nginx HttpLimitReq, les requêtes peuvent être limitées par IP. Cependant, je ne comprends pas ce que fait l'option "nodelay".
Si les demandes en excès dans le délai de rafale limite ne sont pas nécessaires, vous devez utiliser le nodelay
limit_req zone=one burst=5 nodelay;
la source
TL; DR: L'option nodelay est utile si vous souhaitez imposer une limite de débit sans restreindre l'espacement autorisé entre les demandes.
J'ai eu du mal à digérer les autres réponses, puis j'ai découvert une nouvelle documentation de Nginx avec des exemples qui répondent à ceci: https://www.nginx.com/blog/rate-limiting-nginx/
Voici la partie pertinente. Donné:
Si vous ajoutez nodelay:
la source
La façon dont je le vois est la suivante:
Les demandes seront traitées le plus rapidement possible jusqu'à ce que le taux de zone soit dépassé. Le taux de zone est "en moyenne", donc si votre taux est
1r/s
et éclaté,10
vous pouvez avoir 10 demandes en 10 secondes.Une fois le taux de zone dépassé:
une. Sans cela
nodelay
, les demandes ultérieuresburst
seront retardées.b. Avec
nodelay
, les demandes jusqu'àburst
seront traitées le plus rapidement possible.Une fois la valeur
burst
dépassée, le serveur renvoie une réponse d'erreur jusqu'à l'expiration de la fenêtre de rafale. Par exemple, pour le débit1r/s
et la rafale10
, le client devra attendre jusqu'à 10 secondes pour la prochaine demande acceptée.la source
Le paramètre définit si les demandes seront retardées afin qu'elles soient conformes au débit souhaité ou si elles seront simplement rejetées ... quelque peu si la limitation du débit est gérée par le serveur ou si la responsabilité est transférée au client.
nodelay
présentLes demandes seront traitées le plus rapidement possible; toute demande envoyée au-delà de la limite spécifiée sera rejetée avec le code défini comme
limit_req_status
nodelay
absent (alias retardé)Les demandes seront traitées à un taux conforme à la limite spécifiée. Ainsi, par exemple, si un débit est défini sur 10 req / s, chaque demande sera traitée en> = 0,1 (1 / débit) secondes, ce qui ne permettra pas de dépasser le débit, mais permettra de sauvegarder les demandes. Si suffisamment de demandes de sauvegarde pour déborder le compartiment (ce qui serait également empêché par une limite de connexion simultanée), elles sont rejetées avec le code défini comme
limit_req_status
.Les détails sanglants sont ici: https://github.com/nginx/nginx/blob/master/src/http/modules/ngx_http_limit_req_module.c#L263 où cette logique entre en jeu lorsque la limite n'a pas encore été dépassée et maintenant le retard va éventuellement être appliqué à la demande. L'application de
nodelay
notamment de la directive entre en jeu ici: https://github.com/nginx/nginx/blob/master/src/http/modules/ngx_http_limit_req_module.c#L495 provoquant la valeur dedelay
ci - dessus à 0 déclenchant cela gestionnaire pour renvoyer immédiatementNGX_DECLINED
ce qui transmet la demande au gestionnaire suivant (plutôt queNGX_AGAIN
qui le remettra effectivement en attente pour être traité à nouveau).la source
Je n'ai pas compris cela lors de la première lecture de l'introduction de https://www.nginx.com/blog/rate-limiting-nginx/ .
Maintenant, je suis sûr de comprendre et ma réponse est jusqu'à présent la meilleure. :)
Supposons que:
10r/s
est défini, la capacité maximale du serveur est par exemple10000r/s
ce qui est10r/ms
et il n'y a qu'un seul client pour le moment.Voici donc la principale différence entre
10r/s per IP burst=40 nodelay
et10r/s per IP burst=40
.Comme le https://www.nginx.com/blog/rate-limiting-nginx/ l'a documenté ( je recommande fortement de lire l'article en premier (sauf la section de limitation de débit en deux étapes )), ce comportement résout un problème. Laquelle?:
Vérifiez le brouillon que j'ai fait, la
40th
demande obtient une réponse pendant1s
que l'autre40th
obtient une réponse à4s
.Cela peut faire le meilleur usage de la capacité du serveur: renvoie des réponses aussi rapidement que possible tout en conservant la
x r/s
contrainte à un client / IP donné.Mais il y a aussi un coût ici. Le coût sera:
Si plusieurs clients font la queue sur le serveur, disons client
A
,B
etC
.Sans
nodelay
, les demandes sont servies dans un ordre similaire àABCABCABC
.Avec
nodelay
, l'ordre est plus susceptible d'êtreAAABBBCCC
.Je voudrais résumer l'article https://www.nginx.com/blog/rate-limiting-nginx/ ici.
Surtout, la configuration la plus importante est
x r/s
.x r/s
seulement, les demandes excédentaires sont rejetées immédiatement.x r/s
+burst
, les demandes en excès sont mises en file d'attente.1.
vs2.
, le coût est que du côté client, les requêtes en file d'attente saisissent les chances de demandes ultérieures qui auront eu la chance d'être servies.Par exemple,
10r/s burst=20
vs10r/s
, la11th
demande est censée être rejetée immédiatement dans cette dernière condition, mais maintenant elle est mise en file d'attente et sera traitée. La11th
demande prend21th
sa chance.x r/s
+burst
+nodelay
, déjà expliqué.PS La section de limitation de débit en deux étapes de l'article est très déroutante. Je ne comprends pas, mais cela ne semble pas avoir d'importance.
Par exemple:
8 r / s? sérieusement? Il y a 17 demandes dans les 3 secondes affichées dans l'image, 17/3 = 8?
la source