Nginx - อะไรคือความหมายของการนิยาม `burst 'ถ้ามีตัวเลือก' nodelay`


14

ในการกำหนดค่า Nginx เมื่อคุณต้องการ จำกัด อัตราการประมวลผลคำขอโดยใช้limit_req_zone/ limit_req instructionsฉันไม่เข้าใจการใช้nodelayตัวเลือก
ในความเข้าใจของฉันมันจะยกเลิกการร้องขอข้างต้นอัตราที่กำหนดโดยไม่ล่าช้าพวกเขา burst=0ดังนั้นดูเหมือนว่าเทียบเท่ากับ นั่นคือเหตุผลที่ฉันไม่เข้าใจตัวอย่างต่อไปนี้:

limit_req zone=one burst=5 nodelay;

burstกำหนดจำนวนของการร้องขอที่อาจล่าช้าดังนั้นความหมายที่จะกำหนดburstถ้ามีnodelayตัวเลือกคืออะไร?

คำตอบ:


28

ฉันพบlimit_reqเอกสารชัดเจนเพียงพอ

burst มีการบันทึกไว้ด้วยวิธี:

คำขอที่มากเกินไปจะล่าช้าจนกว่าจำนวนของพวกเขาจะเกินกว่าขนาดการระเบิดสูงสุด [... ]

nodelay มีการบันทึกไว้ด้วยวิธี:

หากไม่ต้องการการหน่วงเวลาของคำร้องขอมากเกินไปในขณะที่คำขอถูก จำกัด ควรใช้พารามิเตอร์ nodelay

คำขอถูก จำกัด ให้พอดีกับอัตราที่กำหนด หากมีการร้องขอเข้ามาในอัตราที่สูงไม่เกินจำนวนที่กำหนดของการร้องขอต่อหน่วยเวลาจะเสิร์ฟ จากนั้นคุณต้องตัดสินใจว่าจะทำอย่างไรกับคำขออื่น ๆ เหล่านั้น

  • ตามค่าเริ่มต้น (ไม่ใช่burst, ไม่ใช่nodelay) คำขอจะถูกปฏิเสธพร้อมกับข้อผิดพลาด HTTP 503
  • ด้วยburstคุณสแต็คจำนวนที่กำหนดไว้ของการร้องขอในคิวรอแต่คุณไม่ได้ดำเนินการให้เร็วกว่าที่กำหนดไว้การร้องขอต่อหน่วยเวลาอัตรา
  • ด้วยburstและnodelayคิวจะไม่ได้รับการรอคอยและคำขอระเบิดจะได้รับการประมวลผลทันที

3
ขอขอบคุณสำหรับการชี้แจงของคุณเอกสารไม่ชัดเจนเพียงพอสำหรับฉัน
Nicolas

1
ฉันแก้ไขคำตอบเพื่อสะท้อนเอกสารโดยอ้างถึงมัน ทุกคำมีการถ่วงน้ำหนักอย่างระมัดระวังในเอกสารประกอบของ nginx เพื่อให้กระชับ: นั่นคือสิ่งที่ดีเกี่ยวกับมัน
Bernard Rosset

3
ดังนั้นอะไรคือความแตกต่างระหว่างlimit_req_zone $binary_remote_addr zone=flood:10m rate=6r/s; limit_req zone=flood burst=0;ที่อนุญาตให้มี 6 คำร้องขอต่อวินาทีและlimit_req_zone $binary_remote_addr zone=flood:10m rate=1r/s; limit_req zone=flood burst=5 nodelay;สิ่งที่อนุญาตได้ 6 คำขอต่อวินาที?
Nicolas

2
เพียงแค่ต้องการยืนยันเกี่ยวกับ anwser ของเบอร์นาร์ด ถ้าสิ่งที่เบอร์นาร์ดพูดถูกต้องด้วย burst and nodelay อัตราการโจมตีเว็บเซิร์ฟเวอร์จะมากกว่าคำขอที่กำหนดเป็นครั้งคราวใช่ไหม
Jcyrss

2
@BernardRosset โปรดอธิบายให้ชัดเจนว่า "คิวจะไม่รอ" - คุณหมายถึงอะไร
เดนิสกอร์บาชอฟ

8

ความคิดเห็นเกี่ยวกับคำตอบดั้งเดิมดูเหมือนผิด

คำถามในมือคือความแตกต่างระหว่างพูด rate = 6r / s burst = 0 และ rate = 1r / s burst = 5 nodelay

คำตอบนั้นยอดเยี่ยมเกี่ยวกับการอธิบายความแตกต่างเมื่อไม่มีตัวเลือก nodelay - ในกรณีนี้คำขอจะเข้าคิวกับการระเบิดและ 503 จะไม่มีการระเบิด

คำตอบเดิมดูเหมือนจะเป็นจุด - กับ nodelay คำขอระเบิดได้รับการประมวลผลทันที และก่อนหน้านี้สิ่งเดียวที่เกี่ยวข้องคือไม่มีความแตกต่างระหว่างการระบุ burst + nodelay กับการระบุขีด จำกัด ที่สูงกว่าด้วย busrt = 0 ในตอนแรก

ดังนั้นเพื่อตอบคำถามแบบรวบรัดให้ละเอียดยิ่งขึ้น: ความหมายของการระเบิดเมื่อมีการระบุ nodelay เหมือนกับการระบุอัตราที่มากขึ้นโดยไม่มีการระเบิด


ขอขอบคุณที่ได้ชี้แจงประเด็นนี้ซึ่งเป็นเหตุผลของคำถามของฉันอย่างมีประสิทธิภาพ
นิโคลัส

นี่เป็นสิ่งที่ผิด อ่านคำตอบ + ความคิดเห็นของฉันอีกครั้ง หากคุณยังไม่เห็นลองสร้างภาพร่าง: 6r / s ทั้งการกำหนดค่าที่ Nicolas ให้ไว้ในคอมเม้นท์ในคำตอบของฉัน วินาทีที่สอง -> ทั้งสองสถานการณ์จะให้บริการ 6r แต่ conf # 2 จะเก็บ 5 ต่อเนื่อง วินาทีที่สองและต่อไปจะยังคงเหมือนเดิมสำหรับ conf # 1 (เสิร์ฟทั้งหมด 6r) แต่ conf # 2 จะลบ 1 ออกจากถังระเบิดตามปริมาณการใช้ที่เหมาะสมกับขีด จำกัด อัตราปล่อยให้มีพื้นที่ว่างสำหรับ 1r ในคิว อีก 5r ถูกโยนทิ้งไป
เบอร์นาร์ดรอสเซ็ต

@BernardRosset: แต่ด้วยnodelayนั่นจะไม่หมายความว่าคำขอเหล่านั้นจะถูกประมวลผลทันทีแทนที่จะเข้าคิวหรือไม่
siride

4

เมื่อใช้burstและnodelayระบุฉันพบว่ามันง่ายกว่าที่จะเข้าใจกลไกเช่นนี้ (วิธีอื่น ๆ ที่มักจะเข้าใจ):

  1. คุณอนุญาตได้สูงสุดburstคำขอ ด้วย$binary_remote_addrจำนวนคำขอสูงสุดที่คุณยอมรับจากที่อยู่ที่ระบุ ทุกคำขอเพิ่มตัวนับภายใน เมื่อตัวนับมาถึงburstคำขอเพิ่มเติมทั้งหมดจะถูกปฏิเสธ (และตัวนับจะไม่เพิ่มขึ้นเกินกว่าburstค่า)
  2. rateนับนี้จะลดลงอย่างต่อเนื่องในอัตราที่ระบุโดยใช้

ตรรกะนี้แสดงให้เห็นว่ามันสมเหตุสมผลดีที่จะระบุburstค่าสูง(เช่น 100 ขึ้นไป) และrateค่าต่ำ(แม้แต่บางอย่างเช่น 2r / s) สิ่งนี้จะจัดการการเรียกดูตามปกติ (ชุดคำขอแบบขนานตามด้วยช่วงเวลาที่เงียบ) ดีกว่าในขณะที่ป้องกันการร้องขอบอตสตรีมที่ไม่เปลี่ยนแปลง


1

ฉันถามคำถามของนิโคลัสกับคนที่เขียนโพสต์ด้านล่างในเว็บไซต์ nginx การ จำกัด อัตรา NGINX การตอบกลับของเขามีดังนี้

ในขีด จำกัด อัตราเดิม nginx จะยอมรับคำขอต่อเนื่องเป็นระยะเวลา 1 / 6th วินาที มันจะไม่ยอมรับการร้องขอที่ไม่ตอบสนองช่วงเวลาต่ำสุดนั้น ในทางกลับกันในคำจำกัดความหลัง nginx จะรับคำขอมากถึง 6 คำขอโดยไม่คำนึงถึงช่วงเวลาระหว่างคำขอ ลิงก์คำตอบ


สวัสดี @Gardener และยินดีต้อนรับสู่ Server Fault ขอขอบคุณสำหรับการสนับสนุนที่ดีของคุณ ลิงค์ไปยังแหล่งที่มาชื่นชมมาก
Marco

0

จากคำตอบของ Dan ที่ยอดเยี่ยมและจากซอร์สโค้ดของ nginxสรุปย่อของnodelayพฤติกรรมนั้นน่าจะเป็นดังนี้:

  • burstคือจำนวนคำขอที่เกิดขึ้นพร้อมกันใหม่ที่ได้รับอนุญาต
  • rateคือจำนวนคำขอใหม่ที่เกิดขึ้นพร้อมกันนั้นเก่าต่อหน่วยเวลา (การอัปเดตนี้เกิดขึ้นทีละน้อย: หนึ่งครั้งต่อคำขอ แต่ไม่ใช่ต่อวินาที)

-2

ฉันแนะนำให้อ่านกระทู้นี้: limit_req_zone จำกัด ตามที่ตั้ง / พรอกซี

และคำตอบนี้: stackoverflow


1
คำตอบสำหรับลิงก์เท่านั้นถือว่าเป็นส่วนย่อยบน Server Fault โปรดระบุเนื้อหาที่เป็นประโยชน์ที่นี่จากนั้นเชื่อมโยงที่อื่นเพื่อรับรายละเอียดเพิ่มเติมหากจำเป็น
EEAA
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.