Nginx - quel est le sens de définir `burst 's'il y a l'option` nodelay`


14

Dans la configuration Nginx, lorsque vous souhaitez limiter le taux de traitement des demandes en utilisant le limit_req_zone/ limit_req instructions, je ne comprends pas vraiment l'utilisation de l' nodelayoption.
À ma connaissance, il met fin aux demandes au-dessus du taux défini sans les retarder. Cela semble donc équivalent à burst=0. C'est pourquoi je ne comprends pas l'exemple suivant:

limit_req zone=one burst=5 nodelay;

burstdéfinit le nombre de demandes qui pourraient être retardées, alors quelle est la signification de définir bursts'il y a une nodelayoption?

Réponses:


28

Je trouve la limit_reqdocumentation suffisamment claire.

burst est documenté de cette façon:

Les demandes excessives sont retardées jusqu'à ce que leur nombre dépasse la taille maximale de rafale [...]

nodelay est documenté de cette façon:

Si le retard de demandes excessives pendant que les demandes sont limitées n'est pas souhaité, le paramètre nodelay doit être utilisé

Les demandes sont limitées pour correspondre au taux défini. Si les demandes arrivent à un taux plus élevé, pas plus que le nombre défini de demandes par unité de temps ne sera traité. Vous devez ensuite décider quoi faire avec ces autres demandes.

  • Par défaut (non burst, non nodelay), les demandes sont refusées avec une erreur HTTP 503.
  • Avec burst, vous empilez le nombre défini de demandes dans une file d'attente, mais vous ne les traitez pas plus rapidement que les demandes définies par taux unitaire de temps .
  • Avec burstet nodelay, la file d'attente n'attendra pas et les rafales de requête seront traitées immédiatement .

3
Merci pour votre clarification, la documentation n'est pas assez claire pour moi.
Nicolas

1
J'ai édité ma réponse pour refléter la documentation en la citant. Chaque mot est soigneusement pondéré dans la documentation nginx pour le rendre concis: c'est ce qui est bien à ce sujet.
Bernard Rosset

3
Quelle est donc la différence entre limit_req_zone $binary_remote_addr zone=flood:10m rate=6r/s; limit_req zone=flood burst=0;ce qui autorise 6 requêtes par seconde et celui limit_req_zone $binary_remote_addr zone=flood:10m rate=1r/s; limit_req zone=flood burst=5 nodelay;qui autorise également 6 requêtes par seconde?
Nicolas

2
Je veux juste confirmer la réponse de Bernard. Si ce que Bernard a dit était correct, avec burst et nodelay, le taux de r / s de hit du serveur web sera plus que les requêtes définies de temps en temps, non?
Jcyrss

2
@BernardRosset pourriez-vous s'il vous plaît clarifier la "file d'attente n'attendra pas" - que voulez-vous dire par là?
Denis Gorbachev

8

Les commentaires sur la réponse originale semblent faux.

La question qui se pose est de savoir quelle est la différence entre, par exemple, débit = rafale 6r / s = 0 et débit = rafale 1r / s = 5 nodelay

Les réponses sont excellentes pour expliquer la différence lorsque l'option nodelay n'est PAS présente - dans ce cas, les demandes font la queue avec la rafale et sont 503'd sans la rafale.

La réponse originale semble parfaite - avec nodelay, les demandes de rafale sont traitées immédiatement. Et par conséquent, la seule implication de cela est qu'il n'y a AUCUNE différence entre la spécification d'une rafale + nodelay vs la spécification d'une limite supérieure avec busrt = 0 en premier lieu.

Par conséquent, pour répondre plus succinctement à la question OP: la signification de burst lorsque le nodelay est spécifié est la même que la simple spécification d'un taux plus élevé sans burst.


Merci d'avoir clarifié ce point, ce qui était effectivement la raison de ma question.
Nicolas

C'est faux. Lisez à nouveau ma réponse + commentaires. Si vous ne le voyez toujours pas, faisons un croquis: 6r / s sur les deux configurations fournies par Nicolas dans un commentaire sur ma réponse. 1ère seconde -> les deux scénarios serviront 6r, mais conf # 2 stockera 5 en rafale. 2e seconde et après, toujours la même pour la conf # 1 (tous les 6r servis), mais la conf # 2 aura supprimé 1 du seau de rafale selon une consommation correspondant à la limite de taux, laissant de l'espace pour 1r dans la file d'attente. Les 5 autres sont jetés.
Bernard Rosset

@BernardRosset: mais avec nodelay, cela ne signifie-t-il pas que ces demandes sont traitées immédiatement au lieu d'être mises en file d'attente?
siride

4

Avec burstet nodelayspécifié, je trouve plus facile de comprendre le mécanisme comme celui-ci (l'inverse de ce qu'il est généralement compris):

  1. Vous autorisez un maximum de burstdemandes. Avec $binary_remote_addrc'est le nombre maximum de demandes que vous acceptez d'une adresse donnée. Chaque demande augmente un compteur interne. Lorsque le compteur atteint bursttoutes les demandes supplémentaires sont refusées (et le compteur n'est pas augmenté au-delà de la burstvaleur).
  2. Ce compteur est continuellement diminué à un taux spécifié en utilisant rate.

Cette logique suggère qu'il est parfaitement logique de spécifier une burstvaleur élevée (par exemple 100 et plus) et une ratevaleur faible (même quelque chose comme 2r / s). Cela gère mieux la navigation normale (un lot de demandes parallèles suivies d'une période de silence) tout en protégeant contre le flux de demandes de bot soutenu.


1

J'ai posé la question de Nicolas au gars qui a écrit le post ci-dessous sur le site Web de nginx. NGINX Rate limit . Sa réponse est la suivante

Dans l'ancienne limite de taux, nginx acceptera les demandes consécutives à des intervalles de 1 / 6e de seconde. il n'acceptera pas une rafale de demandes qui ne satisfont pas à cet intervalle de temps minimum. D'un autre côté, dans cette dernière définition, nginx acceptera une rafale de jusqu'à 6 requêtes quel que soit l'intervalle de temps entre les requêtes. Lien de réponse


Bonjour @Gardener et bienvenue sur Server Fault. Merci pour votre contribution bien conçue. Le lien vers la source est très apprécié.
Marco

0

Sur la base de l'excellente réponse de Dan et du code source de nginx , un résumé concis du nodelaycomportement semble être le suivant:

  • burstest le nombre de nouvelles demandes simultanées autorisées.
  • rateest le nombre de nouvelles demandes simultanées devenant anciennes par unité de temps. (Cette mise à jour se fait progressivement: une fois par requête mais pas par seconde.)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.