Nginx-「nodelay」オプションがある場合、「burst」を定義する意味は何ですか


14

Nginxの設定で、limit_req_zone/ を使用してリクエストの処理速度を制限したいlimit_req instructions場合、このnodelayオプションの使用方法がわかりません。
私の理解では、定義されたレートを超えるリクエストを、遅らせることなく終了します。だから、と同等のようburst=0です。だからこそ、私は次の例を理解できない:

limit_req zone=one burst=5 nodelay;

burst遅延する可能性のあるリクエストの数を定義するのでburstnodelayオプションがある場合に定義する意味は何ですか?

回答:


28

limit_reqドキュメンテーションが十分にわかりました。

burst そのように文書化されています:

過剰な要求は、その数が最大バーストサイズを超えるまで遅延されます[...]

nodelay そのように文書化されています:

要求が制限されている間に過剰な要求を遅らせることが望ましくない場合は、パラメータnodelayを使用する必要があります

要求は、定義されたレートに合うように制限されます。要求がより高いレートで着信する場合、時間単位ごとに定義された数を超える要求処理されません。次に、これらの他のリクエストをどう処理するかを決定する必要があります。

  • デフォルト(no burst、no nodelay)では、リクエストはHTTP 503エラーで拒否されます。
  • ではburst、定義された数のリクエストを待機キューにスタックしますが、時間単位レートごとに定義されたリクエストよりも速く処理することはありません
  • burstおよびを使用するとnodelay、キューは待機せず、要求のバーストがすぐに処理されます。

3
あなたの説明をありがとう、ドキュメントは私にとって十分に明確ではありません。
ニコラス14

1
回答を編集して、引用してドキュメントを反映させました。簡潔にするために、nginxのドキュメントではすべての単語に慎重に重みが付けられています。それが素晴らしい点です。
バーナードロセット14年

3
では、limit_req_zone $binary_remote_addr zone=flood:10m rate=6r/s; limit_req zone=flood burst=0;1秒あたり6つのリクエストを許可するものと、1秒あたり6つのリクエストを許可するものとの違いは何limit_req_zone $binary_remote_addr zone=flood:10m rate=1r/s; limit_req zone=flood burst=5 nodelay;ですか?
ニコラス

2
バーナードのアンサーについて確認したいだけです。バーナードが言ったことが正しい場合、バーストとノードレイでは、ウェブサーバーにヒットするr / sレートは、時々定義されたリクエストよりも大きいでしょう?
Jcyrss

2
@BernardRossetでは、「キューが待機しない」ことを明確にしていただけますか?それはどういう意味ですか?
デニスゴルバチョフ

8

元の答えに対するコメントは間違っているようです。

手元の問題は、たとえばrate = 6r / s burst = 0とrate = 1r / s burst = 5 nodelayの違いです

nodelayオプションが存在しない場合の違いの説明についての答えは素晴らしいです。その場合、リクエストはバーストでキューに入れられ、バーストなしで503'dされます。

元の答えはスポットライトのようです-nodelayでは、バーストリクエストはすぐに処理されます。したがって、それが意味するのは、バースト+ノードレイを指定する場合と、最初にbusrt = 0で上限を指定する場合に違いはないということだけです。

したがって、OPの質問により簡潔に答えるには、nodelayが指定されている場合のバーストの意味は、バーストなしでより大きなレートを指定することと同じです。


この点を明確にしたことに感謝します。これが事実上私の質問の理由でした。
ニコラス

これは間違っています。回答とコメントをもう一度お読みください。それでも表示されない場合は、スケッチを作成してみましょう。ニコラスが提供する両方の構成で6r / sで、私の回答のコメントに記載されています。1秒目->両方のシナリオが6rを提供しますが、conf#2は5をバーストで格納します。2秒目以降は、conf#1(すべて6rが配信されます)でも同じですが、conf#2はレート制限に適合する消費に従ってバーストバケットから1を削除し、キューに1rのスペースを残します。他の5rは破棄されます。
バーナードロ

@BernardRosset:しかし、nodelayでは、それらのリクエストがキューに入れられる代わりにすぐに処理されることを意味しませんか?
-siride

4

このようburstnodelay指定すると、このようなメカニズムを理解するのが簡単になります(通常理解されるよりも他の方法で):

  1. 最大数のburstリクエストを許可します。これ$binary_remote_addrは、特定のアドレスから受け入れるリクエストの最大数です。要求ごとに内部カウンターが増加します。カウンターが到達するとburst、追加の要求はすべて拒否されます(カウンターはburst値を超えて増加しません)。
  2. このカウンタは、を使用して指定されたレートで継続的に減少しますrate

このロジックは、高いburst値(100以上など)と低いrate値(2r / sなど)を指定することが完全に理にかなっていることを示唆しています。これにより、通常のブラウジング(並列リクエストのバッチとその後のクワイエット期間)の処理が改善され、ボットリクエストストリームの持続が防止されます。


1

以下の投稿をnginxのウェブサイトに書いた人にニコラスの質問をしました。 NGINXレート制限。彼の返信は以下のとおりです。

前のレート制限では、nginxは1/6秒間隔で連続したリクエストを受け入れます。その最小時間間隔を満たさない要求のバーストを受け入れません。一方、後者の定義では、nginxはリクエスト間の時間間隔に関係なく、最大6つのリクエストのバーストを受け入れます。 回答リンク


@Gardenerこんにちは、サーバーフォールトへようこそ。巧妙に作成された貢献に感謝します。ソースへのリンクは大歓迎です。
マルコ

0

Danの優れた回答nginxのソースコードに基づくと、nodelay動作の簡潔な要約は次のように思われます。

  • burstどのように多くのある新しい同時要求が許可されています。
  • rate多くの方法で新しい同時要求になる古い時間の単位あたり。(この更新は徐々に行われます。1秒間に1回ではなく、1リクエストに1回です。)

-2

私はこのスレッドを読むことを提案しています: limit_req_zone limit by location / proxy

そしてこの答え: stackoverflow


1
リンクのみの回答は、サーバー障害では準標準と見なされます。ここに役立つコンテンツを提供し、必要に応じて他の場所にリンクして詳細をご覧ください。
EEAA
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.