Nginx - `` düğüm '' seçeneği varsa `patlama '' tanımlamanın anlamı nedir


14

Nginx yapılandırmasında, limit_req_zone/ kullanarak istek işleme hızını sınırlamak istediğinizde limit_req instructions, nodelayseçeneğin kullanımını gerçekten anlamıyorum .
Anladığım kadarıyla, geciktirmeden tanımlanan oranın üzerindeki talepleri sonlandırır. Yani buna eşdeğer görünüyor burst=0. Bu yüzden aşağıdaki örneği anlamıyorum:

limit_req zone=one burst=5 nodelay;

burstGeciktirilebilecek istek sayısını tanımlar, yani seçenek burstolup olmadığını tanımlamanın anlamı nodelaynedir?

Yanıtlar:


28

limit_reqBelgeleri yeterince açık buluyorum .

burst şu şekilde belgelenmiştir:

Sayıları maksimum seri çekim boyutunu aşana kadar aşırı istekler ertelenir [...]

nodelay şu şekilde belgelenmiştir:

İstekler kısıtlanırken aşırı isteklerin ertelenmesi istenmiyorsa, parametre düğümü kullanılmalıdır

İstekler, tanımlanan ücrete uygun olarak sınırlandırılmıştır. İstekler daha yüksek bir hızda geliyorsa, zaman birimi başına tanımlanmış istek sayısından fazla olmayacaktır. Daha sonra bu diğer taleplerle ne yapacağınıza karar vermeniz gerekir.

  • Varsayılan olarak (hayır burst, hayır nodelay), HTTP 503 hatasıyla istek reddedilir.
  • İle burst, bir bekleme kuyruğunda isteklerinin belirli sayıda yığını, ancak daha hızlı tanımlı daha onları işlemezseniz zaman birimi başına istekleri oranında .
  • İle burstve nodelay, sıra bekleyen edilmeyecek ve istek patlamaları hemen işleme alacak .

3
Açıklaman için teşekkürler, belgeler benim için yeterince açık değil.
Nicolas

1
Cevabımı alıntı yaparak dokümanları yansıtacak şekilde düzenledim. Özlü hale getirmek için her kelime nginx belgelerinde dikkatlice tartılır: bu konuda güzel olan şey budur.
Bernard Rosset

3
Peki, limit_req_zone $binary_remote_addr zone=flood:10m rate=6r/s; limit_req zone=flood burst=0;saniyede limit_req_zone $binary_remote_addr zone=flood:10m rate=1r/s; limit_req zone=flood burst=5 nodelay;6 isteğe izin veren ve aynı zamanda saniyede 6 istek sağlayan arasındaki fark nedir?
Nicolas

2
Sadece Bernard'ın anwser'ını doğrulamak istiyorum. Bernard'ın söylediği doğruysa, seri çekim ve düğüm ile, web sunucusunun r / s isabet oranı zaman zaman tanımlanan isteklerden daha fazla olacaktır, değil mi?
Jcyrss

2
@BernardRosset "sıra beklemeyecek" diye açıklığa kavuşturabilir misiniz - bununla ne demek istiyorsun?
Denis Gorbachev

8

Orijinal cevaptaki yorumlar yanlış görünüyor.

Eldeki soru, diyelim ki oran = 6r / s patlama = 0 ve oran = 1r / s patlama = 5 düğüm

Yanıtlar, düğüm seçimi seçeneği olmadığında farkı açıklamak konusunda harikadır - bu durumda, istekler veri bloğu sırasında sıraya girer ve veri bloğu olmadan 503'tür.

Orijinal cevap yerinde görünüyor - düğüm ile patlama talepleri hemen işleniyor. Ve bunun tek sonucu, bir burst + nodelay belirtmekle sadece busrt = 0 ile daha yüksek bir limit belirtmek arasında hiçbir fark olmamasıdır.

Bu nedenle, OP sorusunu daha özlü bir şekilde cevaplamak için: düğüm belirtildiğinde patlamanın anlamı, sadece patlama olmadan daha büyük bir oran belirtmekle aynıdır.


Sorumun sebebi olan bu noktayı açıklığa kavuşturduğum için teşekkürler.
Nicolas

Bu yanlış. Cevabımı + yorumlarımı tekrar okuyun. Hala görmüyorsanız, Nicolas'ın her iki yapılandırmada da cevabımla ilgili bir yorumda taslak: 6r / s yapalım. 1. saniye -> her iki senaryo da 6r, ancak konf # 2 patlamada 5 depolar. 2. saniye ve sonrası, hala konf # 1 (hepsi 6r servis edilir) için aynıdır, ancak konf # 2, kuyrukta 1r için boşluk bırakarak, oran sınırına uyan bir tüketime göre patlama patlamadan 1'i çıkarmış olacaktır. Diğer 5r atılır.
Bernard Rosset

@BernardRosset: ancak nodelay, bu isteklerin kuyruğa alınmak yerine hemen işlendiği anlamına gelmez mi?
siride

4

burstVe nodelaybelirtilen ile bu mekanizmayı (genellikle anlaşıldığından başka bir şekilde) anlamak daha kolay buluyorum:

  1. Maksimum burstisteklere izin veriyorsunuz . Bu $binary_remote_addr, belirli bir adresten kabul ettiğiniz maksimum istek sayısıdır. Her istek dahili sayacı artırır. Sayaç ulaştığında bursttüm ek istekler reddedilir (ve sayaç burstdeğerin üzerine çıkmaz).
  2. Bu sayaç, kullanılarak belirtilen bir oranda sürekli olarak azaltılır rate.

Bu mantık, yüksek bir burstdeğer (örneğin 100 ve daha fazlası) ve düşük bir ratedeğer (2r / s gibi bir şey ) belirtmenin mükemmel bir mantıklı olduğunu düşündürmektedir . Bu, sürekli tarama istek akışına karşı koruma sağlarken normal taramayı (bir dizi paralel istek ve ardından sessiz bir dönem) daha iyi işler.


1

Nicolas'ın sorusunu nginx web sitesinde aşağıdaki yazıyı yazan adama sordum. NGINX Hız sınırlayıcı. Bu cevap aşağıdaki gibidir

Önceki ücret sınırında, nginx 1/6 saniye aralıklarla art arda gelen istekleri kabul edecektir. bu minimum zaman aralığını karşılamayan bir dizi istek kabul etmez. Diğer taraftan, ikinci tanımda, nginx, istekler arasındaki zaman aralığına bakılmaksızın 6 isteke kadar bir patlamayı kabul edecektir. Yanıt bağlantısı


Merhaba @ Gardener ve Sunucu Hatası hoş geldiniz. İyi hazırlanmış katkınız için teşekkürler. Kaynak bağlantısı çok takdir edilmektedir.
Marco

0

Dayanarak mükemmel Dan cevap ve üzerinde nginx kaynak koduna , için özlü bir özeti nodelaydavranışı aşağıdaki gibi görünüyor:

  • bursteşzamanlı olarak kaç yeni talebe izin verildiğidir.
  • ratebirim zaman başına kaç yeni eşzamanlı istek eskidir . (Bu güncelleme kademeli olarak gerçekleşir: istek başına bir kez, ancak saniyede bir değil.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.