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メソッドの手順

推薦する

LinuxにKafkaをインストールする

目次1.1 前提条件としてのJava環境1.2 Zookeeperのインストールと設定1.3 Kaf...

Nginx Linux のインストールと展開の詳細なチュートリアル

1. Nginx の紹介Nginxは負荷分散やリバースプロキシにも使えるWebサーバーです。現在最も...

Rails APIを使用してReactアプリケーションを構築するための詳細な手順

目次バックエンド: Rails API部分フロントエンド: React部分Reactコンポーネントa...

nginx を使用してカナリアリリースをシミュレートする方法

この記事では、ブルーグリーン デプロイメントと、nginx を使用してカナリア リリースを最も簡単な...

Linuxでディスク使用量を確認する方法

1. dfコマンドを使用してディスク全体の使用量を表示します。 df コマンドは、ハードディスクのマ...

Linux で Hadoop クラスターをインストールするための詳細な手順

目次1. usrディレクトリにHadoopディレクトリを作成し、インストールパッケージをそのディレク...

Dockerボリューム権限管理の詳細な説明

ボリュームデータボリュームは Docker の重要な概念です。データ ボリュームは、1 つ以上のコン...

フロントエンドタスク構築のための強力なツールであるGulp.jsの使い方を詳しく説明します

目次概要Gulp.jsをインストールするGulp.jsを使用してプロジェクトを作成するgulpfil...

フォームの読み取り専用属性と無効な属性についての簡単な説明

フォーム内の読み取り専用および無効な属性1. 読み取り専用:サーバーは、ユーザーがデータを変更するこ...

Docker を使用して pypi プライベート リポジトリを構築する方法

1. 建設1. htpasswd.txtファイルを準備するファイルには、パッケージを倉庫にアップロー...

Ubuntu で VIM を C++ 開発エディタとして設定する

1. 設定ファイルをユーザー環境にコピーし、新しい.vimフォルダを作成し、バンドルサブフォルダを作...

MySQL EXPLAIN出力列の詳細な説明

1. はじめにEXPLAIN ステートメントは、MySQL がステートメントを実行する方法に関する情...

Virtualbox に Centos7 仮想マシンをインストールする詳細なグラフィック チュートリアル

1. Centos7をダウンロードするダウンロードアドレス: https://mirrors.tun...

MySQLで適切なインデックスを選択する方法

まずは栗を見てみましょう EXPLAIN select * from employees where...