Web アプリケーションの前で Nginx をロードバランサーとして使用できます。
たとえば、エンタープライズ アプリケーションが Apache (または Tomcat) で実行されている場合、エンタープライズ アプリケーションの 2 番目のインスタンスを別のサーバーの Apache (または Tomcat) にセットアップできます。
次に、Nginx をフロントエンドに配置して、2 つの Apache (または Tomcat、または JBoss) サーバー間で負荷を分散します。
Nginx を初めて使用する場合は、Nginx と Apache の違い、および Nginx アーキテクチャを理解することが重要です。
Nginx は、次の 3 種類の負荷分散をサポートしています。
1. Nginx 設定ファイルで上流とproxy_passを定義
負荷分散のために、nginx 構成ファイルに次の 2 つを追加する必要があります:1) アップストリーム 2) proxy_pass
まず上流: 一意の名前 (アプリケーションの名前の場合もあります) を指定し、この Nginx によって負荷分散されるすべてのサーバーを一覧表示します。
次の例では、「crmdev」はアップストリームの名前であり、個々の Apache Web サーバー (以下に示すように 101.1 と 102.2) の両方で実行されているアプリケーションの名前です。 「crmdev」の代わりに、ここで好きなものを指定できます。
注:アップストリームは、Nginx の「http」コンテキスト内で定義する必要があります。
upstream crmdev { server 192.168.101.1; server 192.168.101.2; }
注:個々のサーバーが別のポート (ポート 80 以外) で実行されている場合は、アップストリームで以下に示すようにポート番号を指定してください
upstream crmdev { server 192.168.101.1:8080; server 192.168.101.2:8080; }
第二に、proxy_pass: 以下に示すように、「サーバー」セクションの下にある「ロケーション」セクション内で、前のステップで定義された一意のアップストリーム名を proxy_pass として指定します。
server { listen 80; location / { proxy_pass http://crmdev; } }
注:この例では、nginx 自体が listen パラメーターによって上記のようにポート 80 でリッスンしています。
また、proxy_pass を使用して Nginx を Apache/PHP のリバース プロキシとしてセットアップすることもできます。
2. Nginxのデフォルト設定ファイルでupstreamとproxy_passを定義
注:通常、上記は以下に示すように http または https の下にある必要があります。
http { upstream crmdev { server 192.168.101.1:8080; server 192.168.101.2:8080; } server { listen 80; location / { proxy_pass http://crmdev; } } }
ただし、デフォルトの nginx.conf ファイルに付属する default.conf を使用している場合は、http コンテキストで既に定義されているため、「http」を指定する必要はありません。
注:HTTPS の場合、「http」コンテキスト (上記の 1 行目) を https に置き換えます。また、proxy_pass 行では、https://{your-upstream-name}
を使用します。この場合、上記のように「http」を使用すると、次のような http ディレクティブは許可されていませんというエラー メッセージが表示される場合があります。
Starting nginx: nginx: [emerg] "http" directive is not allowed here in /etc/nginx/conf.d/default.conf:1
これは私の default.conf ファイルのコピーです。先頭にアップストリームを追加し (http なし)、デフォルトの場所をコメント アウトし、proxy_pass を使用して新しい場所を追加しました。
# vi /etc/nginx/conf.d/default.conf upstream crmdev { server 127.0.0.1:4080; server 127.0.0.1:7080; } server { listen 3080; server_name localhost; #location / { # root /usr/share/nginx/html; # index index.html index.htm; #} location / { proxy_pass http://crmdev; } .. .. }
3. Nginx ロード バランサの最小接続アルゴリズムのセットアップ
このアルゴリズムでは、着信要求は、既存のアクティブな接続の数が最も少ないサーバーに送信されます。
このために、以下に示すように、アップストリームの上部にキーワード「least_conn」を追加します。
upstream crmdev { least_conn; server 192.168.101.1:8080; server 192.168.101.2:8080; }
least_conn に複数のサーバーがリストされていて、複数のサーバーの既存のアクティブな接続数が同様に少ない場合、それらのサーバーの中から加重ラウンドロビンに基づいて 1 つが選択されます。
4. Nginx ロード バランサーの永続性またはスティッキー アルゴリズムのセットアップ
ラウンド ロビンおよび最小接続方式の欠点は、クライアントからの後続の接続がプール内の同じサーバーに移動しないことです。これは、セッションに依存しないアプリケーションでは問題ない場合があります。
ただし、アプリケーションがセッションに依存している場合、特定のサーバーとの最初の接続が確立されると、その特定のクライアントからの以降のすべての接続が同じサーバーに送られるようにする必要があります。これには、以下に示すように ip_hash アルゴリズムを使用します。
upstream crmdev { ip_hash; server 192.168.101.1:8080; server 192.168.101.2:8080; }
ハッシュの場合、IPv4 アドレスの場合、最初の 3 オクテットが使用されます。 IPv6 アドレスの場合、アドレス全体が使用されます。
5.個々のサーバーの重量オプション
プール内の特定のサーバーの重みを指定することもできます。デフォルトでは、すべてのサーバーの優先度 (重み) は同じです。つまり、重みのデフォルト値は 1 です。
ただし、以下に示すようにサーバーに重みを割り当てることで、この動作を変更できます。
upstream crmdev { server 192.168.101.1:8080; server 192.168.101.2:8080; server 192.168.101.3:8080 weight 2; server 192.168.101.4:8080; server 192.168.101.5:8080; }
この例では、合計 5 つのサーバーがあります。ただし、3 番目のサーバーの重みは 2 です。これは、6 つの新しいリクエストごとに、2 つのリクエストが 3 番目のサーバーに送られ、残りのサーバーが 1 つのリクエストを取得することを意味します。
したがって、これは、より多くの馬力を持つ特定のサーバーにより多くの負荷を分散するのに役立ちます.
上記の例では、デフォルトのラウンドロビン アルゴリズムで重みが使用されていますが、least_conn と ip_hash にも重みを使用できます。
6.個々のサーバーのタイムアウト オプション – max_fails および fail_timeout
以下に示すように、max_fails と fail_timeout を特定のサーバーに指定することもできます。
upstream crmdev { server 192.168.101.1:8080 max_fails=3 fail_timeout=30s; server 192.168.101.2:8080; server 192.168.101.3:8080 weight 2; server 192.168.101.4:8080; server 192.168.101.5:8080; }
上記では:
- デフォルトの fail_timeout は 10 秒です。上記の例では、これは 30 秒に設定されています。これは、試行の失敗回数が x 回 (max_fails で定義) された場合、30 秒以内にサーバーが使用できなくなることを意味します。また、サーバーは 30 秒間利用できなくなります。
- デフォルトの max_fails は 1 回です。上記の例では、これは 3 回の試行に設定されています。これは、この特定のサーバーへの接続試行が 3 回失敗すると、Nginx はこのサーバーが fail_timeout (30 秒) の間利用できないと見なすことを意味します。
7. Nginx LoadBalancer プールにバックアップ サーバーを割り当てる
次の例では、サーバー パラメータの末尾に「backup」キーワードを使用して、5 番目のサーバーをバックアップとしてマークします。
upstream crmdev { server 192.168.101.1:8080 max_fails=3 fail_timeout=30s; server 192.168.101.2:8080; server 192.168.101.3:8080 weight 2; server 192.168.101.4:8080; server 192.168.101.5:8080 backup; }
以上で5台目のサーバー(192.168.101.5)がバックアップサーバーになります。他の 4 つのサーバーがすべてダウンしていない限り、着信要求はこのサーバーに渡されません。