目次
基本的な紹介
高負荷なネットワーク環境では、サービスの安定性を維持するために、トラフィック量を制御する速度制限(ダウンロード速度)が必要な手段となります。Nginx は、高性能 Web サーバーおよびリバース プロキシ サーバーであり、2 つの主要な命令 limit_rate_after および limit_rate を使用して、トラフィック制御と速度制限を実現できます。
NGINX トラフィック管理の 3 つの主要機能の 1 つである帯域幅制御は、実装が比較的簡単です。これは、単一の接続に帯域幅制御を実装するだけであり、多くの場合、クライアント トラフィック管理を実装するためにレート制御および同時実行制御と組み合わせて使用されます。
NGINX アーキテクチャの観点から見ると、単一接続のライフサイクル全体が別のワーカー プロセスで処理されます。したがって、帯域幅制御では、ワーカー プロセス間でデータを共有および同期する必要がありません。レート制御や同時実行制御などのデータを共有および同期するために共有メモリ ゾーンを定義する必要はありません。このことから、帯域制御命令には、レート制御や同時実行制御に必要な共有メモリ領域を定義する命令が含まれていません。
コマンド構成
リミットレート
limit_rate コマンドは、クライアントに送信されるデータ伝送速度を制御するために使用され、接続全体のトラフィックを制限したり、単一のクライアントのアクセス速度を制限したりできます。
Syntax:limit_rate rate;
Default:limit_rate 0;
Context:http, server, location, if in location
応答としてクライアントに送信されるデータの速度を制限します。単位は BYTES/秒です。デフォルト値 0 は、レート制限がないことを意味します。この制限は接続リクエストごとに設定されるため、クライアントに同時に n 個の並列接続がある場合、クライアントの全体的なレートは、limit_rate の n 倍になります。
limit_rate 1k;
制限レート_後
一定数の BYTES が送信された後、帯域幅制御が実装されます。命令limit_rateと同様に、以下のパラメータ値を変数を通じて設定できます。
Syntax:limit_rate_after size;
Default:limit_rate_after 0;
Context:http, server, location, if in location
コマンドlimit_rate_afterは、limit_rateが設定されている場合にのみ有効になります。limit_rate_after のみを設定した場合、帯域幅制御の効果はありません。
location /test/ {
limit_rate_after 500k;
limit_rate 50k;
}
sendfile_max_chunk ディレクティブが同時に設定されている場合、帯域幅は 2 つの値のうち小さい方に基づいて制御されます。
実技試験
location / {
limit_rate 1k;
root html;
}
ブラウザに入力してhttp://xxxx/portal.tar
portal.tar ファイルをダウンロードすると、ダウンロード速度が 1k 以内であることがわかります。
location / {
limit_rate_after 50m;
limit_rate 1k;
root html;
}
ブラウザに入力してhttp://xxxx/portal.tar
portal.tar ファイルをダウンロードします
50mダウンロード後、速度は1kに制限されます
原理: トークンバケットアルゴリズム
NGINX は、帯域幅制御にトークン バケット アルゴリズムを使用します。古典的なグラフ バイアスを使用して、トークン バケット アルゴリズムを記述します。
具体的なプロセスは次のとおりです。
- システムは固定レートでトークンを生成し、トークン バケットにキャッシュします。
- トークン バケットがいっぱいになると、追加のトークンは破棄されます。
- メッセージを送信すると、メッセージのサイズに応じて対応する数のトークンが消費されます。
- トークンが不足している場合、メッセージを送信できません。
トークン バケット アルゴリズムでは、「バケット」を使用してトークンを保管し、キューを使用してリクエストを保管します。リーキーバケットアルゴリズムとトークンバケットアルゴリズムの機能面での最も明らかな違いは、バーストトラフィック(バースト)の処理を許可するかどうかであり、リーキーバケットアルゴリズムはデータのリアルタイム送信(処理)速度を強制的に制限することができます。トラフィック制御 (ポリシー) を実装する処理。一方、トークン バケット アルゴリズムは、ある程度のバースト送信を許可しながらデータの平均送信レートを制限でき、トラフィック シェーピング (整形)。