Linux で Nginx を HTTP ロード バランサとして使用する方法
冗長性を確保するために複数のアプリケーション サーバーを設定する場合、負荷分散は、受信したサービス リクエストやネットワーク トラフィックをバックエンド サーバーのグループ全体に効率的に分散するために一般的に使用されるメカニズムです。
負荷分散には、冗長性によるアプリケーションの可用性の向上、信頼性とスケーラビリティの向上 (トラフィックが増加した場合にはさらに多くのサーバーを追加できます) など、いくつかの利点があります。また、アプリケーションのパフォーマンスの向上やその他の多くの利点ももたらします。
推奨読書: Nginx Web サーバーのセキュリティを確保、強化し、パフォーマンスを向上させるための究極のガイド
Nginx は、受信ネットワーク トラフィックとワークロードをアプリケーション サーバーのグループに分散するための効率的なHTTP ロード バランサー として導入でき、それぞれの場合、選択したサーバーからの応答をアプリケーション サーバーに返します。適切なクライアント。
Nginx でサポートされている負荷分散方式は次のとおりです。
- ラウンドロビン – リクエストをラウンドロビン方式でアプリケーション サーバーに分散します。メソッドが指定されていない場合はデフォルトで使用されます。
- 最も接続が少ない – 次のリクエストをビジー度の低いサーバー (アクティブな接続数が最も少ないサーバー) に割り当てます。
- ip-hash – ハッシュ関数を使用して、クライアントの IP アドレスに基づいて次のリクエストにどのサーバーを選択するかを決定します。この方法では、セッションの永続化 (クライアントを特定のアプリケーション サーバーに結び付ける) が可能になります。
さらに、サーバーの重みを使用して、 より高度なレベルでNginx 負荷分散アルゴリズムに影響を与えることができます。 Nginx は、サーバーの応答がエラーで失敗した場合にサーバーを失敗としてマークするヘルス チェックもサポートしています (設定可能な時間、デフォルトは 10 秒)。しばらくの間、後続の受信リクエストのためにサーバーを維持します。
この実用的なガイドでは、Nginx をHTTP ロード バランサーとして使用し、同じアプリケーションのインスタンスを持つ 2 つのサーバー間で受信クライアント リクエストを分散する方法を説明します。
テスト目的で、各アプリケーション インスタンスには、実行されているサーバーを示すために (ユーザー インターフェイス上で)ラベルが付けられます。
テスト環境のセットアップ
Load Balancer: 192.168.58.7
Application server 1: 192.168.58.5
Application server 2: 192.168.58.8
各アプリケーション サーバーでは、各アプリケーション インスタンスはドメイン tecmintapp.lan
を使用してアクセスされるように構成されています。これが完全に登録されたドメインであると仮定すると、DNS 設定に次の内容を追加します。
A Record @ 192.168.58.7
このレコードは、ドメインがどこに送信されるべきか、この場合は ロード バランサ (192.168.58.7) をクライアント リクエストに伝えます。 DNS A
レコードは IPv4 値のみを受け入れます。あるいは、次のエントリを使用して、クライアント マシン上の /etc/hosts ファイルをテスト目的に使用することもできます。
192.168.58.7 tecmintapp.lan
Linux での Nginx ロード バランシングのセットアップ
Nginx 負荷分散を設定する前に、図に示すように、ディストリビューションのデフォルトのパッケージ マネージャーを使用してサーバーにNginx をインストールする必要があります。
sudo apt install nginx [On Debian/Ubuntu]
sudo yum install nginx [On CentOS/RHEL]
次に、/etc/nginx/conf.d/loadbalancer.conf
という名前のサーバー ブロック ファイルを作成します (任意の名前を付けます)。
sudo vi /etc/nginx/conf.d/loadbalancer.conf
次に、次の構成をコピーしてそこに貼り付けます。負荷分散方法が定義されていないため、この構成はデフォルトでラウンドロビンになります。
upstream backend {
server 192.168.58.5;
server 192.168.58.8;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name tecmintapp.lan;
location / {
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://backend;
}
}
上記の設定では、 proxy_pass
ディレクティブ (この場合は /
という場所内で指定する必要があります) を使用して、 アップストリーム ディレクティブ内の単語 backend (サーバーのグループを定義するために使用されます)。また、リクエストは重み付きラウンドロビン バランシング メカニズムを使用してサーバー間で分散されます。
最小限の接続メカニズムを採用するには、次の構成を使用します。
upstream backend {
least_conn;
server 192.168.58.5;
server 192.168.58.8;
}
ip_hash
セッション永続化メカニズムを有効にするには、次を使用します。
upstream backend {
ip_hash;
server 192.168.58.5;
server 192.168.58.8;
}
サーバーの重みを使用して負荷分散の決定に影響を与えることもできます。次の構成を使用すると、クライアントから 6 つのリクエストがある場合、アプリケーション サーバー 192.168.58.5 には 4 つのリクエストが割り当てられ、2 つは 192.168.58.8 になります。
upstream backend {
server 192.168.58.5 weight=4;
server 192.168.58.8;
}
ファイルを保存して終了します。次に、次のコマンドを実行して、最近の変更を追加した後、Nginx 構成構造が正しいことを確認します。
sudo nginx -t
構成に問題がない場合は、Nginx サービスを再起動して有効にし、変更を適用します。
sudo systemctl restart nginx
sudo systemctl enable nginx
Linux での Nginx ロード バランシングのテスト
Nginx 負荷分散をテストするには、Web ブラウザを開き、次のアドレスを使用して移動します。
http://tecmintapp.lan
Web サイトのインターフェイスが読み込まれたら、読み込まれたアプリケーション インスタンスをメモします。その後、ページを継続的に更新します。ある時点で、負荷分散を示す 2 番目のサーバーからアプリがロードされる必要があります。
Linux で HTTP ロード バランサとしてNginx を設定する方法を学習しました。このガイド、特にロード バランサーとしての Nginx の採用についてのご意見を、以下のフィードバック フォームからお聞かせください。詳細については、HTTP ロード バランサとしての Nginx の使用に関する Nginx のドキュメントを参照してください。