Nginx - qual è il significato per definire `burst` se esiste l'opzione` nodelay`


14

Nella configurazione di Nginx, quando vuoi limitare la velocità di elaborazione della richiesta usando limit_req_zone/ limit_req instructions, non capisco davvero l'uso nodelaydell'opzione.
A mio avviso, termina le richieste al di sopra della tariffa definita senza ritardarle. Quindi sembra equivalente a burst=0. Ecco perché non capisco il seguente esempio:

limit_req zone=one burst=5 nodelay;

burstdefinisce il numero di richieste che potrebbero essere ritardate, quindi qual è il significato da definire burstse esiste l' nodelayopzione?

Risposte:


28

Trovo la limit_reqdocumentazione abbastanza chiara.

burst è documentato in questo modo:

Le richieste eccessive vengono ritardate fino a quando il loro numero non supera la dimensione massima [...]

nodelay è documentato in questo modo:

Se non si desidera ritardare richieste eccessive mentre le richieste sono limitate, è necessario utilizzare il parametro nodelay

Le richieste sono limitate per adattarsi alla tariffa definita. Se le richieste arrivano a un tasso più elevato, non verrà servito più del numero definito di richieste per unità di tempo . È quindi necessario decidere cosa fare con quelle altre richieste.

  • Per impostazione predefinita (no burst, no nodelay), le richieste vengono negate con un errore HTTP 503.
  • Con burst, è impilare il numero definito di richieste in una coda di attesa, ma non li elabora più velocemente di quanto gli definiti richieste per unità di tempo dei tassi .
  • Con burste nodelay, la coda non attenderà e le raffiche di richieste verranno elaborate immediatamente .

3
Grazie per il tuo chiarimento, la documentazione non è abbastanza chiara per me.
Nicolas,

1
Ho modificato la mia risposta per riflettere la documentazione citandola. Ogni parola è attentamente ponderata nella documentazione di nginx per renderla concisa: questo è bello.
Bernard Rosset,

3
Quindi qual è la differenza tra limit_req_zone $binary_remote_addr zone=flood:10m rate=6r/s; limit_req zone=flood burst=0;quale consente 6 richieste al secondo e limit_req_zone $binary_remote_addr zone=flood:10m rate=1r/s; limit_req zone=flood burst=5 nodelay;che consente anche 6 richieste al secondo?
Nicolas,

2
Voglio solo confermare la risposta di Bernard. Se ciò che Bernard ha detto fosse corretto, con burst e nodelay, la frequenza di hit del server web sarà più delle richieste definite di volta in volta, giusto?
Jcyrss,

2
@BernardRosset potresti per favore chiarire che "la coda non sarà in attesa" - cosa intendi con questo?
Denis Gorbachev,

8

I commenti sulla risposta originale sembrano sbagliati.

La domanda a portata di mano è quale sia la differenza, diciamo rate = 6r / s burst = 0 e rate = 1r / s burst = 5 nodelay

Le risposte sono ottime per spiegare la differenza quando l'opzione nodelay NON è presente - nel qual caso, le richieste fanno la fila con il burst e vengono 503 senza il burst.

La risposta originale sembra perfetta: con nodelay, le richieste di burst vengono elaborate immediatamente. E quindi, l'unica implicazione di ciò è che NON c'è alcuna differenza tra la specifica di un burst + nodelay rispetto al solo specificare un limite superiore con busrt = 0 in primo luogo.

Pertanto, per rispondere in modo più succinto alla domanda OP: il significato di burst quando viene specificato nodelay è lo stesso di specificare un tasso più grande senza burst.


Grazie per aver chiarito questo punto, che era effettivamente il motivo della mia domanda.
Nicolas

Questo è sbagliato. Leggi di nuovo la mia risposta + commenti. Se ancora non lo vedi, facciamo uno schizzo: 6r / s su entrambe le configurazioni fornite da Nicolas in un commento sulla mia risposta. 1 ° secondo -> entrambi gli scenari serviranno 6r, ma conf # 2 memorizzerà 5 in raffica. Dal secondo secondo in poi, sempre lo stesso per la conf. 1 (tutti i 6r serviti), ma la conf. 2 avrà rimosso 1 dal secchio a raffica in base a un consumo adeguato al limite di velocità, lasciando spazio per 1r nella coda. Gli altri 5r vengono gettati via.
Bernard Rosset,

@BernardRosset: ma con nodelay, ciò non significa che tali richieste vengono elaborate immediatamente anziché in coda?
Siride,

4

Con burste nodelayspecificato trovo più facile capire il meccanismo in questo modo (viceversa di quanto di solito sia compreso):

  1. Consenti un massimo di burstrichieste. Con $binary_remote_addrquesto è il numero massimo di richieste accettate da un determinato indirizzo. Ogni richiesta aumenta un contatore interno. Quando il contatore raggiunge bursttutte le richieste aggiuntive vengono negate (e il contatore non viene aumentato oltre il burstvalore).
  2. Questo contatore viene continuamente ridotto a una velocità specificata utilizzando rate.

Questa logica suggerisce che ha perfettamente senso specificare un burstvalore elevato (ad es. 100 e più) e un ratevalore basso (anche qualcosa come 2r / s). Questo gestisce meglio la normale navigazione (una serie di richieste parallele seguite da un periodo di inattività), proteggendo al contempo da flussi di richieste bot sostenute.


1

Ho fatto la domanda di Nicolas al ragazzo che ha scritto il post qui sotto nel sito web di nginx. NGINX Limitazione della velocità. La sua risposta è la seguente

Nel precedente limite di velocità, nginx accetterà richieste consecutive a intervalli di 1/6 di secondo. non accetterà una serie di richieste che non soddisfano tale intervallo di tempo minimo. D'altra parte in quest'ultima definizione, nginx accetterà una raffica di un massimo di 6 richieste indipendentemente dall'intervallo di tempo tra le richieste. Link di risposta


Ciao @Gardener e benvenuto su Server Fault. Grazie per il tuo contributo ben realizzato. Il link alla fonte è molto apprezzato.
Marco

0

Sulla base dell'ottima risposta di Dan e del codice sorgente di nginx , un breve riassunto del nodelaycomportamento sembra essere il seguente:

  • burstindica quante nuove richieste simultanee sono consentite.
  • rateindica quante nuove richieste simultanee diventano obsolete per unità di tempo. (Questo aggiornamento avviene gradualmente: una volta per richiesta ma non al secondo.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.