回答:
limit_req
ドキュメンテーションが十分にわかりました。
burst
そのように文書化されています:
過剰な要求は、その数が最大バーストサイズを超えるまで遅延されます[...]
nodelay
そのように文書化されています:
要求が制限されている間に過剰な要求を遅らせることが望ましくない場合は、パラメータnodelayを使用する必要があります
要求は、定義されたレートに合うように制限されます。要求がより高いレートで着信する場合、時間単位ごとに定義された数を超える要求は処理されません。次に、これらの他のリクエストをどう処理するかを決定する必要があります。
burst
、no nodelay
)では、リクエストはHTTP 503エラーで拒否されます。burst
、定義された数のリクエストを待機キューにスタックしますが、時間単位レートごとに定義されたリクエストよりも速く処理することはありません。burst
およびを使用するとnodelay
、キューは待機せず、要求のバーストがすぐに処理されます。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;
ですか?
元の答えに対するコメントは間違っているようです。
手元の問題は、たとえばrate = 6r / s burst = 0とrate = 1r / s burst = 5 nodelayの違いです
nodelayオプションが存在しない場合の違いの説明についての答えは素晴らしいです。その場合、リクエストはバーストでキューに入れられ、バーストなしで503'dされます。
元の答えはスポットライトのようです-nodelayでは、バーストリクエストはすぐに処理されます。したがって、それが意味するのは、バースト+ノードレイを指定する場合と、最初にbusrt = 0で上限を指定する場合に違いはないということだけです。
したがって、OPの質問により簡潔に答えるには、nodelayが指定されている場合のバーストの意味は、バーストなしでより大きなレートを指定することと同じです。
nodelay
では、それらのリクエストがキューに入れられる代わりにすぐに処理されることを意味しませんか?
このようburst
にnodelay
指定すると、このようなメカニズムを理解するのが簡単になります(通常理解されるよりも他の方法で):
burst
リクエストを許可します。これ$binary_remote_addr
は、特定のアドレスから受け入れるリクエストの最大数です。要求ごとに内部カウンターが増加します。カウンターが到達するとburst
、追加の要求はすべて拒否されます(カウンターはburst
値を超えて増加しません)。rate
。このロジックは、高いburst
値(100以上など)と低いrate
値(2r / sなど)を指定することが完全に理にかなっていることを示唆しています。これにより、通常のブラウジング(並列リクエストのバッチとその後のクワイエット期間)の処理が改善され、ボットリクエストストリームの持続が防止されます。
以下の投稿をnginxのウェブサイトに書いた人にニコラスの質問をしました。 NGINXレート制限。彼の返信は以下のとおりです。
前のレート制限では、nginxは1/6秒間隔で連続したリクエストを受け入れます。その最小時間間隔を満たさない要求のバーストを受け入れません。一方、後者の定義では、nginxはリクエスト間の時間間隔に関係なく、最大6つのリクエストのバーストを受け入れます。 回答リンク
Danの優れた回答とnginxのソースコードに基づくと、nodelay
動作の簡潔な要約は次のように思われます。
burst
どのように多くのある新しい同時要求が許可されています。rate
多くの方法で新しい同時要求になる古い時間の単位あたり。(この更新は徐々に行われます。1秒間に1回ではなく、1リクエストに1回です。)私はこのスレッドを読むことを提案しています: limit_req_zone limit by location / proxy
そしてこの答え: stackoverflow