Nginx - ý nghĩa của việc xác định `nổ` là gì nếu có tùy chọn` gật đầu


14

Trong cấu hình Nginx, khi bạn muốn giới hạn tốc độ xử lý yêu cầu bằng cách sử dụng limit_req_zone/ limit_req instructions, tôi không thực sự hiểu việc sử dụng nodelaytùy chọn.
Theo hiểu biết của tôi, nó chấm dứt các yêu cầu trên mức xác định mà không trì hoãn chúng. Vì vậy, nó có vẻ tương đương với burst=0. Đó là lý do tại sao tôi không hiểu ví dụ sau:

limit_req zone=one burst=5 nodelay;

burstxác định số lượng yêu cầu có thể bị trì hoãn, vậy ý ​​nghĩa của việc xác định burstnếu có nodelaytùy chọn là gì?

Câu trả lời:


28

Tôi tìm limit_reqtài liệu đủ rõ ràng.

burst được ghi lại theo cách đó:

Yêu cầu quá mức bị trì hoãn cho đến khi số lượng của chúng vượt quá kích thước cụm tối đa [...]

nodelay được ghi lại theo cách đó:

Nếu việc trì hoãn các yêu cầu quá mức trong khi các yêu cầu bị hạn chế là không mong muốn, thì nên sử dụng nút tham số

Yêu cầu được giới hạn để phù hợp với tỷ lệ được xác định. Nếu các yêu cầu được gửi đến với tốc độ cao hơn, không nhiều hơn số lượng yêu cầu được xác định cho mỗi đơn vị thời gian sẽ được phục vụ. Sau đó, bạn cần phải quyết định phải làm gì với những yêu cầu khác.

  • Theo mặc định (không burst, không nodelay), các yêu cầu bị từ chối với lỗi HTTP 503.
  • Với burst, bạn ngăn xếp số lượng xác định các yêu cầu trong một hàng đợi chờ đợi, nhưng bạn không xử lý chúng nhanh hơn so với định nghĩa yêu cầu mỗi đơn vị thời gian tỷ lệ .
  • Với burstnodelay, hàng đợi sẽ không được chờ đợi và yêu cầu cụm sẽ được xử lý ngay lập tức .

3
Cảm ơn bạn đã làm rõ, tài liệu không đủ rõ ràng cho tôi.
Nicolas

1
Tôi đã chỉnh sửa câu trả lời của mình để phản ánh tài liệu bằng cách trích dẫn nó. Mỗi từ đều được cân nhắc cẩn thận trong tài liệu nginx để làm cho nó ngắn gọn: đó là những gì tốt đẹp về nó.
Bernard Rosset

3
Vì vậy, sự khác biệt giữa limit_req_zone $binary_remote_addr zone=flood:10m rate=6r/s; limit_req zone=flood burst=0;cho phép 6 yêu cầu mỗi giây và limit_req_zone $binary_remote_addr zone=flood:10m rate=1r/s; limit_req zone=flood burst=5 nodelay;cũng cho phép 6 yêu cầu mỗi giây?
Nicolas

2
Chỉ muốn xác nhận về anwser của Bernard. Nếu những gì Bernard nói là chính xác, Với sự bùng nổ và gật đầu, tốc độ r / s của máy chủ web sẽ nhiều hơn các yêu cầu được xác định theo thời gian, phải không?
Jcyrss

2
@BernardRosset bạn có thể vui lòng làm rõ "hàng đợi sẽ không chờ đợi" - ý của bạn là gì không?
Denis Gorbachev

8

Các ý kiến ​​về câu trả lời ban đầu có vẻ sai.

Câu hỏi đặt ra là sự khác biệt giữa, giả sử tỷ lệ = 6r / s nổ = 0 và tỷ lệ = 1r / s nổ = 5 gật đầu

Các câu trả lời rất hay về việc giải thích sự khác biệt khi không có tùy chọn gật đầu - trong trường hợp đó, các yêu cầu xếp hàng với cụm và là 503'd mà không có cụm.

Câu trả lời ban đầu có vẻ như tại chỗ - với gật đầu, các yêu cầu liên tục được xử lý ngay lập tức. Và do đó, hàm ý duy nhất của điều đó là KHÔNG có sự khác biệt giữa việc chỉ định cụm + gật đầu so với chỉ định giới hạn cao hơn với busrt = 0 ở vị trí đầu tiên.

Do đó, để trả lời ngắn gọn hơn cho câu hỏi OP: ý nghĩa của cụm từ khi gật đầu được chỉ định cũng giống như chỉ định tỷ lệ lớn hơn mà không nổ.


Nhờ đã làm rõ điểm này, đó thực sự là lý do cho câu hỏi của tôi.
Nicolas

Cái này sai. Đọc câu trả lời của tôi + bình luận một lần nữa. Nếu bạn vẫn không thấy nó, hãy vẽ phác thảo: 6r / s trên cả hai cấu hình được cung cấp bởi Nicolas trong một nhận xét về câu trả lời của tôi. Giây thứ nhất -> cả hai kịch bản sẽ phục vụ 6r, nhưng conf # 2 sẽ lưu trữ 5 lần. Giây thứ 2 trở đi, vẫn như vậy đối với conf # 1 (tất cả 6r được phục vụ), nhưng conf # 2 sẽ xóa 1 khỏi thùng nổ theo mức tiêu thụ phù hợp với giới hạn tốc độ, chừa khoảng trống cho 1r trong hàng đợi. 5r còn lại bị vứt đi.
Bernard Rosset

@BernardRosset: nhưng với nodelay, điều đó có nghĩa là những yêu cầu đó được xử lý ngay lập tức thay vì xếp hàng?
siride

4

Với burstnodelayđược chỉ định tôi thấy dễ hiểu cơ chế như thế này (cách khác hơn là thường được hiểu):

  1. Bạn cho phép tối đa các burstyêu cầu. Với $binary_remote_addrsố lượng yêu cầu tối đa mà bạn chấp nhận từ một địa chỉ nhất định. Mỗi yêu cầu tăng một bộ đếm nội bộ. Khi bộ đếm đạt đến bursttất cả các yêu cầu bổ sung bị từ chối (và bộ đếm không được tăng quá burstgiá trị).
  2. Bộ đếm này liên tục giảm với tốc độ được chỉ định bằng cách sử dụng rate.

Logic này gợi ý rằng việc xác định burstgiá trị cao (ví dụ 100 trở lên) và rategiá trị thấp (thậm chí là 2r / s) có ý nghĩa hoàn hảo . Điều này xử lý duyệt bình thường (một loạt các yêu cầu song song theo sau là một khoảng thời gian yên tĩnh) tốt hơn trong khi bảo vệ chống lại luồng yêu cầu bot được duy trì.


1

Tôi đã hỏi câu hỏi của Nicolas cho anh chàng đã viết bài dưới đây trên trang web nginx. Tỷ lệ NGINX giới hạn. Trả lời của bạn như dưới đây

Trong giới hạn tỷ lệ cũ, nginx sẽ chấp nhận các yêu cầu liên tiếp trong khoảng thời gian 1/6 giây. nó sẽ không chấp nhận một loạt các yêu cầu không thỏa mãn khoảng thời gian tối thiểu đó. Mặt khác trong định nghĩa sau, nginx sẽ chấp nhận một loạt tối đa 6 yêu cầu bất kể khoảng thời gian giữa các yêu cầu. Liên kết trả lời


Xin chào @Gardener và chào mừng bạn trên Server Fault. Cảm ơn sự đóng góp của bạn. Các liên kết đến nguồn rất được đánh giá cao.
Marco

0

Dựa trên câu trả lời xuất sắc của Dan mã nguồn của nginx , một bản tóm tắt ngắn gọn cho nodelayhành vi dường như là như sau:

  • burst là bao nhiêu yêu cầu đồng thời mới được cho phép.
  • ratelà có bao nhiêu yêu cầu đồng thời mới trở thành trên mỗi đơn vị thời gian. (Việc cập nhật này diễn ra dần dần: một lần cho mỗi yêu cầu nhưng không phải mỗi giây.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.