Nginx - Tùy chọn gật đầu làm gì khi giới hạn yêu cầu?


11

Với các yêu cầu mô đun nginx HttpLimitReq có thể bị giới hạn bởi IP. Tuy nhiên, tôi không hiểu tùy chọn "gật đầu" làm gì.

Nếu các yêu cầu vượt quá trong độ trễ cụm giới hạn là không cần thiết, bạn nên sử dụng nút

limit_req   zone=one  burst=5  nodelay;

Câu trả lời:


11

Tài liệu ở đây có một lời giải thích nghe giống như những gì bạn muốn biết:

Lệnh chỉ định vùng (vùng) và cụm yêu cầu (cụm) tối đa có thể có. Nếu tỷ lệ vượt quá các yêu cầu được nêu trong vùng, yêu cầu sẽ bị trì hoãn, do đó các truy vấn được xử lý ở một tốc độ nhất định

Theo những gì tôi hiểu, các yêu cầu trong cụm sẽ bị trì hoãn (mất thêm thời gian và đợi cho đến khi chúng có thể được phục vụ), với các nodelaytùy chọn, độ trễ không được sử dụng và các yêu cầu vượt quá bị từ chối với lỗi 503.

Bài đăng trên blog này ( archive.org ) đưa ra lời giải thích tốt về cách giới hạn tỷ lệ hoạt động trên nginx:

Nếu bạn giống tôi, có lẽ bạn đang tự hỏi cái quái gì thực sự có nghĩa là gì. Đây là mẹo: thay thế từ 'nổ' bằng 'xô' và giả sử rằng mọi người dùng đều được cấp một thùng có 5 mã thông báo. Mỗi lần vượt quá tốc độ 1 yêu cầu mỗi giây, họ phải trả một mã thông báo. Khi họ đã sử dụng tất cả các mã thông báo của mình, họ sẽ nhận được thông báo lỗi HTTP 503, về cơ bản đã trở thành tiêu chuẩn cho 'back off, man!'.


4
Tôi nghĩ bạn không chính xác, hướng dẫn sử dụng nginx nêu rõ: "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". Lưu ý rằng cho đến khi vượt quá mức tối đa có nghĩa hoàn toàn khác so với cụm mà bạn đã nói. Bạn cũng đã kết hợp cụm với các yêu cầu vượt quá , tôi tin rằng các yêu cầu vượt quá có nghĩa là nó nằm trên vùng đó, trong khi nó vẫn có thể nằm dưới mức nổ tối đa .
Hendy

10

TL; DR: Tùy chọn gật đầu rất hữu ích nếu bạn muốn áp đặt giới hạn tốc độ mà không hạn chế khoảng cách cho phép giữa các yêu cầu.

Tôi đã có một thời gian khó khăn để tiêu hóa các câu trả lời khác, và sau đó tôi phát hiện ra tài liệu mới từ Nginx với các ví dụ trả lời này: https://www.nginx.com/blog/rate-limiting-nginx/

Đây là phần thích hợp. Được:

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;

location /login/ {
  limit_req zone=mylimit burst=20;
  ...
}

Tham số cụm xác định số lượng yêu cầu mà khách hàng có thể thực hiện vượt quá tốc độ được chỉ định bởi vùng (với vùng mylimit mẫu của chúng tôi, giới hạn tốc độ là 10 yêu cầu mỗi giây hoặc 1 cứ sau 100 mili giây). Một yêu cầu đến sớm hơn 100 mili giây sau khi yêu cầu trước được đưa vào hàng đợi và ở đây chúng tôi đang đặt kích thước hàng đợi thành 20.

Điều đó có nghĩa là nếu 21 yêu cầu đến từ một địa chỉ IP nhất định, NGINX sẽ chuyển tiếp yêu cầu đầu tiên đến nhóm máy chủ ngược dòng và đặt 20 yêu cầu còn lại vào hàng đợi. Sau đó, nó sẽ chuyển tiếp một yêu cầu được xếp hàng cứ sau 100 mili giây và chỉ trả về 503 cho khách hàng nếu một yêu cầu đến làm cho số lượng yêu cầu được xếp hàng vượt quá 20.

Nếu bạn thêm gật đầu:

location /login/ {
  limit_req zone=mylimit burst=20 nodelay;
  ...
}

Với tham số gật đầu, NGINX vẫn phân bổ các vị trí trong hàng đợi theo tham số cụm và áp đặt giới hạn tốc độ được định cấu hình, nhưng không bằng cách chuyển tiếp các yêu cầu xếp hàng. Thay vào đó, khi một yêu cầu đến quá sớm, NGINX sẽ chuyển tiếp yêu cầu ngay lập tức miễn là có một vị trí có sẵn cho nó trong hàng đợi. Nó đánh dấu vị trí đó như là đã lấy ra và đã không giải phóng nó để sử dụng bởi một yêu cầu khác cho đến khi thời gian thích hợp trôi qua (trong ví dụ của chúng tôi, sau 100 mili giây).


6

Cách tôi nhìn thấy như sau:

  1. Yêu cầu sẽ được phục vụ nhanh nhất có thể cho đến khi vượt quá tỷ lệ khu vực. Tỷ lệ vùng là "trung bình", vì vậy nếu tốc độ của bạn là 1r/svà bùng nổ, 10bạn có thể có 10 yêu cầu trong cửa sổ 10 giây.

  2. Sau khi vượt quá tỷ lệ vùng:

    a. Nếu không nodelay, yêu cầu thêm lên burstsẽ bị trì hoãn.

    b. Với nodelay, các yêu cầu tiếp theo burstsẽ được phục vụ nhanh nhất có thể.

  3. Sau khi burstvượt quá, máy chủ sẽ trả về phản hồi lỗi cho đến khi cửa sổ nổ hết hạn. ví dụ: đối với tốc độ 1r/svà chuỗi 10, khách hàng sẽ cần đợi tối đa 10 giây cho yêu cầu được chấp nhận tiếp theo.


3

Cài đặt xác định liệu các yêu cầu sẽ bị trì hoãn để chúng phù hợp với tỷ lệ mong muốn hay liệu chúng sẽ bị từ chối đơn giản ... phần nào cho dù giới hạn tốc độ được quản lý bởi máy chủ hay trách nhiệm được chuyển cho khách hàng.

nodelay hiện tại

Yêu cầu sẽ được xử lý nhanh nhất có thể; mọi yêu cầu được gửi vượt quá giới hạn đã chỉ định sẽ bị từ chối với mã được đặt làlimit_req_status

nodelay vắng mặt (còn gọi là trì hoãn)

Yêu cầu sẽ được xử lý theo tỷ lệ phù hợp với giới hạn quy định. Vì vậy, ví dụ: nếu tốc độ được đặt là 10 req / s thì mỗi yêu cầu sẽ được xử lý trong> = .1 (1 / tỷ lệ) giây, do đó không cho phép vượt quá tốc độ, nhưng cho phép các yêu cầu được sao lưu. Nếu đủ yêu cầu sao lưu để tràn xô (cũng sẽ bị ngăn bởi giới hạn kết nối đồng thời), thì chúng sẽ bị từ chối với mã được đặt là limit_req_status.

Chi tiết tin đồn có tại đây: https://github.com/nginx/nginx/blob/master/src/http/modules/ngx_http_limit nbq_module.c#L263 khi logic đó bắt đầu khi giới hạn chưa được thông qua là tùy chọn sẽ được áp dụng cho yêu cầu. Ứng dụng nodelayđặc biệt từ chỉ thị được sử dụng ở đây: https://github.com/nginx/nginx/blob/master/src/http/modules/ngx_http_limit nbq_module.c#L495 khiến giá trị delayở trên bằng 0 xử lý để trả lại ngay lập tức NGX_DECLINEDchuyển yêu cầu đến trình xử lý tiếp theo (chứ không phải yêu cầu xử lý NGX_AGAINmột cách hiệu quả để xử lý lại).


1

Tôi đã không hiểu điều đó vào lần đầu tiên khi tôi đọc phần giới thiệu từ https://www.nginx.com/blog/rate-limiting-nginx/ .

Bây giờ tôi chắc chắn tôi hiểu và câu trả lời của tôi cho đến nay là tốt nhất. :)

Giả sử: 10r/sđược thiết lập, khả năng tối đa của máy chủ là ví dụ 10000r/sđó là 10r/msvà chỉ có 1 khách hàng tại thời điểm này.

Vì vậy, đây là sự khác biệt chính giữa 10r/s per IP burst=40 nodelay10r/s per IP burst=40.

nhập mô tả hình ảnh ở đây

https://www.nginx.com/blog/rate-limiting-nginx/ được ghi lại ( tôi thực sự khuyên bạn nên đọc bài viết trước (ngoại trừ phần Giới hạn tỷ lệ hai giai đoạn )), hành vi này khắc phục một vấn đề. Cái nào?:

Trong ví dụ của chúng tôi, gói thứ 20 trong hàng đợi chờ 2 giây để được chuyển tiếp, tại thời điểm đó, một phản hồi cho nó có thể không còn hữu ích cho khách hàng.

Kiểm tra dự thảo tôi đã thực hiện, 40thyêu cầu nhận được phản hồi 1strong khi người khác 40thnhận được phản hồi tại 4s.

Điều này có thể tận dụng tốt nhất khả năng của máy chủ: gửi lại phản hồi nhanh nhất có thể trong khi vẫn giữ x r/sràng buộc cho một máy khách / IP nhất định.

Nhưng cũng có chi phí ở đây. Chi phí sẽ là:

Nếu bạn có nhiều khách hàng xếp hàng trên máy khách nói máy chủ cho phép của A, BC.

Không có nodelay, các yêu cầu được phục vụ theo thứ tự tương tự ABCABCABC.
Với nodelay, thứ tự có nhiều khả năng được AAABBBCCC.


Tôi muốn tổng hợp bài viết https://www.nginx.com/blog/rate-limiting-nginx/ tại đây.

Trên hết, cấu hình quan trọng nhất là x r/s.

  1. x r/s chỉ, yêu cầu vượt quá bị từ chối ngay lập tức.

  2. x r/s+ burst, yêu cầu vượt quá được xếp hàng.

1.vs 2., chi phí là ở phía khách hàng, các yêu cầu được xếp hàng sẽ chiếm cơ hội cho các lần tái khám sau này sẽ có cơ hội được phục vụ.

Ví dụ: 10r/s burst=20vs 10r/s, 11thyêu cầu được cho là bị từ chối ngay lập tức theo điều kiện sau, nhưng bây giờ nó được xếp hàng và sẽ được phục vụ. Các 11thyêu cầu chiếm các 21thcơ hội của yêu cầu.

  1. x r/s+ burst+ nodelay, đã được giải thích.

PS Phần giới hạn tỷ lệ hai giai đoạn của bài viết rất khó hiểu. Tôi không hiểu nhưng điều đó dường như không quan trọng.

Ví dụ:

Với cấu hình này, một khách hàng thực hiện một luồng yêu cầu liên tục với tốc độ 8 r / s trải nghiệm hành vi sau.

8 r / s? nghiêm túc? Có 17 yêu cầu trong vòng 3 giây được hiển thị trong hình ảnh, 17/3 = 8?

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.