Nginx ロードバランシングとは何か、そしてそれをどのように設定するか

Nginx ロードバランシングとは何か、そしてそれをどのように設定するか

負荷分散とは

負荷分散は主に、専用のハードウェア デバイスまたはソフトウェア アルゴリズムによって実現されます。ハードウェア デバイスを通じて実現される負荷分散は、効果が高く、効率が高く、パフォーマンスが安定していますが、コストが比較的高くなります。ソフトウェアを通じて実装される負荷分散は、主に分散アルゴリズムの選択とプログラムの堅牢性に依存します。負荷分散アルゴリズムにも多くの種類があり、最も一般的なものは、静的負荷分散アルゴリズムと動的負荷分散アルゴリズムの 2 つのカテゴリに分類されます。静的アルゴリズムは実装が比較的簡単で、一般的なネットワーク環境で比較的良好な結果を達成できます。主に、一般的なポーリング アルゴリズム、比率ベースの加重ポーリング アルゴリズム、および優先度ベースの加重ポーリング アルゴリズムが含まれます。動的負荷分散アルゴリズムは、より複雑なネットワーク環境において、より適応性が高く、効果的です。主なものとしては、タスク量に基づく最小接続優先度アルゴリズム、パフォーマンスに基づく最速応答優先度アルゴリズム、予測アルゴリズム、および動的パフォーマンス割り当てアルゴリズムがあります。

ネットワーク負荷分散技術の一般的な原則は、特定の分散戦略を使用してネットワーク負荷をネットワーク クラスターの各オペレーティング ユニットに均等に分散し、単一の高負荷タスクを複数のユニットで共有して並列処理したり、大量の同時アクセスやデータ トラフィックを複数のユニットで共有して個別に処理したりすることで、ユーザーの待機応答時間を短縮することです。

Nginx サーバーの負荷分散構成

Nginx サーバーは、静的な優先度ベースの重み付けポーリング アルゴリズムを実装しています。使用される主な構成は、proxy_pass ディレクティブとupstream ディレクティブです。これらの内容は実際には非常に理解しやすいです。重要な点は、Nginx サーバーの構成が柔軟で多様であることです。負荷分散を構成しながら他の機能を合理的に統合して、実際のニーズを満たす構成ソリューションを形成する方法。

以下は基本的な例の抜粋です。もちろん、すべての構成状況を網羅することは不可能です。議論の出発点として役立つことを願っています。同時に、実際の適用プロセスでは、全員が要約してさらに蓄積することも必要です。設定時に注意が必要なポイントはコメントとして追加されます。

構成例1: すべてのリクエストに対して一般的なラウンドロビン負荷分散ポリシーを実装する

次の例スニペットでは、バックエンド サーバー グループ内のすべてのサーバーの優先度がデフォルトの weight=1 に設定されており、一般的なポーリング戦略に従って順番に要求タスクを受信します。この構成は、Nginx サーバーの負荷分散を実装するための最も簡単な構成です。 www.myweb.name へのすべてのリクエストは、バックエンド サーバー グループ間で負荷分散されます。サンプルコードは次のとおりです。

...

 アップストリームバックエンド #バックエンドサーバーグループを構成する {
    サーバー 192.168.1.2:80;
    サーバー 192.168.1.3:80;
    サーバー 192.168.1.4:80; #デフォルトの重み=1
}
サーバ
{
    聞く 80;
    サーバー名 www.myweb.name;
    インデックス index.html index.htm;
    位置 / {
        proxy_pass http://backend;
        prox_set_header ホスト $host;
    }
    ...
}

設定例2: すべてのリクエストに対して重み付けラウンドロビン負荷分散を実装する

「構成例 1」と比較すると、この例のフラグメントでは、バックエンド サーバー グループ内のサーバーに異なる優先度レベルが割り当てられ、重み変数の値はポーリング戦略の「重み」になります。このうち、192.168.1.2:80 はレベルが最も高く、クライアントからの要求を最も少なく受信して処理するサーバーです。192.168.1.4:80 はレベルが最も低く、クライアントからの要求を最も少なく受信して処理するサーバーです。192.168.1.3:80 は上記 2 つの中間です。 www.myweb.name へのすべてのリクエストは、バックエンド サーバー グループ内で重み付けされて負荷分散されます。サンプルコードは次のとおりです。

...

 アップストリームバックエンド #バックエンドサーバーグループを構成する {
    サーバー 192.168.1.2:80 重み=5;
    サーバー 192.168.1.3:80 重み=2;
    サーバー 192.168.1.4:80; #デフォルトの重み=1
}
サーバ
{
    聞く 80;
    サーバー名 www.myweb.name;
    インデックス index.html index.htm;
    位置 / {
        proxy_pass http://backend;
        prox_set_header ホスト $host;
    }
    ...
}

構成例3: 特定のリソースの負荷分散

この例のスニペットでは、プロキシ サーバーのグループを 2 つ設定します。1 つは「videobackend」という名前で、ビデオ リソースに対するクライアント要求の負荷分散に使用され、もう 1 つはファイル リソースに対するクライアント要求の負荷分散に使用されます。 「http://www.mywebname/video/*」へのすべてのリクエストはビデオバックエンド サーバー グループに分散され、「http://www.mywebname/file/*」へのすべてのリクエストはファイルバックエンド サーバー グループに分散されます。この例は、一般的な負荷分散を実装するための構成を示しています。重み付け負荷分散の構成については、「構成例 2」を参照してください。

location /file/ {......} ブロックでは、リクエスト ヘッダーの「Host」、「X-Real-IP」、「X-Forwareded-For」ヘッダー フィールドにそれぞれクライアントの実際の情報を入力します。これにより、バックエンド サーバー グループが受信したリクエストには、Nginx サーバー情報ではなく、クライアントの実際の情報が保持されます。サンプルコードは次のとおりです。

...

 アップストリームビデオバックエンド #バックエンドサーバーグループ1を構成する
{
    サーバー 192.168.1.2:80;
    サーバー 192.168.1.3:80;
    サーバー 192.168.1.4:80;
}
アップストリームファイルバックエンド #バックエンドサーバーグループ2を構成する
{
    サーバー 192.168.1.5:80;
    サーバー 192.168.1.6:80;
    サーバー 192.168.1.7:80;
}
サーバ
{
    聞く 80;
    サーバー名 www.myweb.name;
    インデックス index.html index.htm;
    場所 /ビデオ/ {
        proxy_pass http://videobackend; #バックエンドサーバーグループ1を使用する
        prox_set_header ホスト $host;
        ...
    }
    場所 /file/ {
        proxy_pass http://filebackend; #バックエンドサーバーグループ2を使用する
                                        #クライアントの実際の情報を保持 prox_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        ...
    }
}

設定例4: 異なるドメイン名の負荷分散

この例のスニペットでは、異なるドメイン名の要求を受信し、これらの要求に対して負荷分散を実行するために、2 つの仮想サーバーと 2 セットのバックエンド プロキシ サーバー グループを設定します。クライアント要求ドメイン名が「home.myweb.name」の場合、サーバー server1 がそれ​​を受信し、負荷分散のために homebackend サーバー グループに転送します。クライアント要求ドメイン名が「bbs.myweb.name」の場合、サーバー server2 がそれを受信し、負荷分散のために bbsbackend サーバー レベルに転送します。これにより、異なるドメイン名の負荷分散が実現されます。

2 つのバックエンド サーバー グループのうちの 1 つ、サーバー 192.168.1.4:80 が共有されていることに注意してください。クライアント要求に問題が発生しないようにするには、2 つのドメイン名の下にあるすべてのリソースをサーバーに展開する必要があります。サンプルコードは次のとおりです。

...
アップストリーム bbsbackend #バックエンドサーバーグループ 1 を構成する
{
    サーバー 192.168.1.2:80 重み=2;
    サーバー 192.168.1.3:80 重み=2;
    サーバー 192.168.1.4:80;
}
アップストリームホームバックエンド #バックエンドサーバーグループ2を構成する
{
    サーバー 192.168.1.4:80;
    サーバー 192.168.1.5:80;
    サーバー 192.168.1.6:80;
}
                                        #サーバー1の設定を開始
サーバ
{
    聞く 80;
    server_name home.myweb.name;
    インデックス index.html index.htm;
    位置 / {
        proxy_pass http://homebackend;
        prox_set_header ホスト $host;
        ...
    }
    ...
}
                                        #サーバー2の設定を開始
サーバ
{
    聞く 80;
    サーバー名 bbs.myweb.name;
    インデックス index.html index.htm;
    位置 / {
        proxy_pass http://bbsbackend;
        prox_set_header ホスト $host;
        ...
    }
    ...
}

構成例5: URL書き換えによる負荷分散の実装

まず、例 1 に基づいて変更された具体的なソース コードを見てみましょう。

...
アップストリームバックエンド #バックエンドサーバーグループを構成する {
    サーバー 192.168.1.2:80;
    サーバー 192.168.1.3:80;
    サーバー 192.168.1.4:80; #デフォルトの重み=1
}
サーバ
{
    聞く 80;
    サーバー名 www.myweb.name;
    インデックス index.html index.htm;

         場所 /file/ {
        最後に ^(/file/.*)/media/(.*)\.*$) $1/mp3/$2.mp3 を書き換えます。
    }

         位置 / {
        proxy_pass http://backend;
        prox_set_header ホスト $host;
    }
    ...
}

「構成 1」と比較すると、このサンプル フラグメントでは、「/file/」を含む URI の URL 書き換え機能が追加されます。たとえば、クライアントが要求した URL が「http://www.myweb.name/file/downlaod/media/1.mp3」の場合、仮想サーバーはまず場所の file/{......} ブロックを使用して、バックエンド サーバー グループに転送し、負荷分散を実現します。このように、URL 書き換え機能による負荷分散を簡単に実装できます。この構成スキームでは、目的の効果を得るために、書き換え命令内の最後のタグとブレーク タグの違いを明確に理解する必要があります。

上記の 5 つの構成例は、さまざまな状況下で Nginx サーバーに負荷分散構成を実装する基本的な方法を示しています。 Nginx サーバーの機能は構造的に増分的であるため、これらの構成に基づいて、Web キャッシュ、Gzip 圧縮テクノロジ、ID 認証、権限管理などの機能を継続的に追加できます。同時に、upstream ディレクティブを使用してサーバー グループを構成すると、各ディレクティブの機能を最大限に活用して、ニーズを満たし、効率的で安定した、機能が豊富な Nginx サーバーを構成できます。

上記は、Nginx ロード バランシングとは何か、そしてそれをどのように設定するかについての詳細です。Nginx ロード バランシングの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Nginx の負荷分散と動的および静的分離の原理と構成
  • Nginx レイヤー 4 負荷分散構成ガイド
  • Nginx ロードバランシングの設定方法
  • 負荷分散と動的・静的分離を実現するNginx+Tomcatの原理の分析
  • Nginx+tomcat ロードバランシングクラスタの実装方法
  • 負荷分散と動的および静的分離操作を実現するDocker NginxコンテナとTomcatコンテナ
  • Nginx + consul + upsync を使用して動的負荷分散を実現する方法の詳細な説明
  • 複数サーバーの負荷分散を実現するためのNginx構成

<<:  Vue でのルータービューコンポーネントの使用に関する詳細な説明

>>:  サブセットかどうかを判断するためのMySQLメソッドの手順

推薦する

リソースアップロード機能を実現するための SpringBoot+nginx の詳細な例

最近、画像、ビデオ、CSS/JS などの静的リソースを配置するために nginx を使用する方法を学...

ふるい抽選を実施するミニプログラム

この記事の例では、ふるい抽選を実装するためのミニプログラムの具体的なコードを参考までに共有しています...

MySQL 5.7.25 圧縮版のインストールと設定方法のグラフィックチュートリアル

この記事では、MySQL 5.7.25圧縮版のインストールと設定方法を参考までに紹介します。具体的な...

ウェブデザインにおけるポップアップウィンドウとフローティングレイヤーのデザイン

従来のソフトウェアから Web ウェアへの段階的な移行の傾向の中で、デザイン パターンとテクノロジは...

MySQL 5.7.17 のインストールと設定方法のグラフィックチュートリアル (Win7 の場合)

Windows 7 で MySQL 5.7.17 をインストールする方法についてのグラフィック チ...

Webstorm と Chrome を使用して Vue プロジェクトをデバッグする方法

目次序文1. 新しいVueプロジェクトを作成する2. WebStormの設定1. デバッガポートを設...

echarts ワードクラウドチャートを使用した Vue の実践記録

echartsワードクラウドはechartsの拡張版ですhttps://echarts.apache...

サーバー上で selenium+chromedriver を実行するための詳細なチュートリアル

1. はじめにSelenium を使用して Web サイトからデータをスクレイピングしたいのですが、...

JavaScript 日付ツールの概要

ユーティリティ = { /** * 死亡年ですか? * @return {Boolse} true...

MySQL InnoDB の重要なコンポーネントの概要

Innodbには以下のコンポーネントが含まれています1. innodb_buffer_pool:これ...

mysql ルートユーザーを認証できず、Navicat リモート認証プロンプト 1044 の問題を解決します

まず解決策を見てみましょう #------------mysql の root ユーザーに権限を付与...

Node.jsはブレークポイント再開を実装する

目次ソリューション分析スライス履歴書のダウンロード具体的な解決プロセス論理的分析フロントエンドサーバ...

MySQL データベース グループ クエリの group by ステートメントの詳細な説明

1: グループ化関数の記述順序 1 選択 ... 2 から ... 3 どこで ... 4 グループ...

HTML メタタグの使用の概要 (推奨)

メタタグ機能METAタグは、HTMLタグのHEAD領域にある重要なタグです。文書の文字セット、使用言...

MySQL 使用仕様の概要

1. InnoDBストレージエンジンを使用する必要がありますCPU と IO のパフォーマンスが向上...