目次
なぜサーバーの負荷分散が必要なのか1台構成のサーバーで起こる3つの問題複数サーバー+ロードバランサーで解決できることNginxロードバランサーの仕組みと役割Nginxとは?無料で使える高性能Webサーバーロードバランサーが果たす「交通整理」の役割リクエストを複数サーバーに振り分ける仕組みNginxでロードバランシングを実装する基本設定最小構成の設定例|upstreamとproxy_pass実務で必須の設定を追加する(ヘッダー転送・タイムアウト)コピペで使える完全な設定ファイル例負荷分散の方法(アルゴリズム)を選ぶラウンドロビン|順番に振り分けるデフォルト設定最小接続数|処理中のリクエストが少ないサーバーを優先IPハッシュ|同じユーザーを同じサーバーに振り分けるどのアルゴリズムを選べばいいか?用途別の選び方サーバー障害時の自動切り替えを設定するヘルスチェックでダウンしたサーバーを自動除外バックアップサーバーで障害時も安定稼働まとめ|Nginxで始めるシンプルで確実な負荷分散サーバーの負荷分散が必要な理由Nginxロードバランサーの強み実装の基本ステップ負荷分散アルゴリズムの選び方障害対策で可用性を高める最初の一歩を踏み出そうシステムの成長に合わせて拡張できるRabilooのシステム開発サービス

Share

戻る
ホーム / ブログ / Tech / Nginxでロードバランサーを構築する|サーバー負荷分散の基本と実践設定

Nginxでロードバランサーを構築する|サーバー負荷分散の基本と実践設定

Nginxでロードバランサーを構築する|サーバー負荷分散の基本と実践設定
目次
なぜサーバーの負荷分散が必要なのか1台構成のサーバーで起こる3つの問題複数サーバー+ロードバランサーで解決できることNginxロードバランサーの仕組みと役割Nginxとは?無料で使える高性能Webサーバーロードバランサーが果たす「交通整理」の役割リクエストを複数サーバーに振り分ける仕組みNginxでロードバランシングを実装する基本設定最小構成の設定例|upstreamとproxy_pass実務で必須の設定を追加する(ヘッダー転送・タイムアウト)コピペで使える完全な設定ファイル例負荷分散の方法(アルゴリズム)を選ぶラウンドロビン|順番に振り分けるデフォルト設定最小接続数|処理中のリクエストが少ないサーバーを優先IPハッシュ|同じユーザーを同じサーバーに振り分けるどのアルゴリズムを選べばいいか?用途別の選び方サーバー障害時の自動切り替えを設定するヘルスチェックでダウンしたサーバーを自動除外バックアップサーバーで障害時も安定稼働まとめ|Nginxで始めるシンプルで確実な負荷分散サーバーの負荷分散が必要な理由Nginxロードバランサーの強み実装の基本ステップ負荷分散アルゴリズムの選び方障害対策で可用性を高める最初の一歩を踏み出そうシステムの成長に合わせて拡張できるRabilooのシステム開発サービス

ECサイトやWebサービスで、アクセスが集中してサイトが重くなったり、最悪の場合サーバーがダウンしてしまった経験はありませんか?

こうしたトラブルの原因は、1台のサーバーへの負荷集中です。特にセールやキャンペーン時には、アクセス急増でサーバーダウンのリスクが高まります。

結論から申し上げると、Nginxを使ったロードバランサーの導入で、この問題は解決できます。

実は、複数のサーバーに処理を振り分ける「負荷分散」の仕組みを導入すれば、1台のサーバーに負荷が集中するのを防ぎ、安定したサービス提供が可能になります。Nginxなら、オープンソースで無料、かつシンプルな設定で実現できます。

この記事では、Nginxを使ったロードバランシングの基本から、実務でそのまま使える設定まで、必要最小限に絞って解説します。

この記事でわかること
  • なぜサーバーの負荷分散が必要なのか

  • Nginxロードバランサーの基本的な仕組み

  • 実務で使える具体的な設定方法(コピペで動く設定例)

  • 負荷分散の方法(アルゴリズム)の選び方

なぜサーバーの負荷分散が必要なのか

Webサービスやアプリケーションを運用していると、必ずぶつかる壁が「アクセス集中時のサーバー負荷」です。特に、ECサイトのセール開始直後や、テレビで紹介された直後など、予想を超えるアクセスが殺到すると、サーバーが悲鳴をあげます。

では、なぜ1台のサーバーだけでは対応できないのでしょうか。そして、複数のサーバーとロードバランサーを組み合わせることで、どのような問題が解決できるのでしょうか。

1台構成のサーバーで起こる3つの問題

従来のシステムでは、すべてのユーザーからのリクエストを1台のサーバーで処理していました。しかし、この構成には大きな問題があります。

1. サーバーへの過大な負荷

アクセスが集中すると、1台のサーバーがすべてのリクエストを処理しなければなりません。CPUやメモリのリソースが限界に達すると、処理速度が極端に遅くなります。例えば、通常1秒で表示されるページが10秒、20秒とかかるようになり、ユーザーは待ちきれずに離脱してしまいます。

2. レスポンスの大幅な遅延

サーバーが処理しきれないリクエストは、キューに溜まっていきます。つまり、後から来たユーザーは、前のユーザーの処理が終わるまで待たされることになります。ビジネスの機会損失につながるだけでなく、ユーザー体験を大きく損ないます。

3. サーバーダウンのリスク増加

最悪の場合、サーバーのリソースが完全に枯渇し、サーバーがダウンしてしまいます。1台構成では、そのサーバーがダウンした瞬間にサービス全体が停止します。復旧するまでの間、すべてのユーザーがサービスを利用できなくなり、ビジネスに致命的な影響を与えます。

ECサイトなら売上機会の損失、銀行システムなら顧客の信頼失墜、予約システムなら予約業務の完全停止など、業種を問わず深刻な事態を招きます。

複数サーバー+ロードバランサーで解決できること

ロードバランサー(負荷分散システム)とは

これらの問題を解決するのが、複数のサーバーとロードバランサーを組み合わせた構成です。ロードバランサーは、ユーザーからのリクエストを複数のサーバーに振り分ける「交通整理」の役割を果たします。

負荷の分散による安定性の向上

例えば、1台で処理していたリクエストを3台のサーバーで分担すれば、各サーバーの負荷は理論上3分の1になります。これにより、アクセスが集中しても、各サーバーが余裕を持って処理できるようになり、レスポンス速度を維持できます。

システムの継続稼働を実現

さらに重要なのが、冗長性の確保です。複数台のサーバー構成なら、1台がダウンしても他のサーバーが処理を引き継ぎます。ロードバランサーは障害が発生したサーバーを自動的に検知し、正常なサーバーにのみリクエストを振り分けます。つまり、サービスを止めることなく運用を続けられるのです。

柔軟な拡張性

ビジネスの成長に合わせて、サーバーを追加するだけで処理能力を増やせます。ロードバランサーの設定にサーバーを追加するだけで、システム全体の性能を向上させられます。逆に、アクセスが落ち着いた時期にはサーバーを減らしてコストを最適化することも可能です。

このように、ロードバランサーを導入することで、システムの安定性、可用性、拡張性が飛躍的に向上します。そして、これを実現する強力なツールが、次に解説するNginxです。

Nginxロードバランサーの仕組みと役割

サーバーの負荷分散が必要な理由がわかったところで、次はその実現手段であるNginxについて理解を深めましょう。Nginxは世界中の大規模サイトで採用されている、信頼性の高いオープンソースソフトウェアです。

ここでは、Nginxとは何か、そしてロードバランサーとしてどのように機能するのかを解説します。

Nginxとは?無料で使える高性能Webサーバー

Nginxのアーキテクチャ

Nginx(エンジンエックス)は、2004年にロシアのエンジニアIgor Sysoevによって開発された、高性能なWebサーバーソフトウェアです。オープンソースで無料で利用でき、世界中の多くのWebサイトやアプリケーションで採用されています。

Nginxの最大の特徴は、大量の同時接続を効率的に処理できる点です。従来のWebサーバーが1つのリクエストに1つのプロセスを割り当てる方式だったのに対し、Nginxは非同期イベント駆動という仕組みを採用しています。

わかりやすく例えると、従来のWebサーバーは「1人の店員が1人のお客様を最後まで対応する」方式でした。そのため、お客様が多いと店員が足りなくなります。一方、Nginxは「複数の店員が複数のお客様を同時並行で効率よく対応する」イメージです。待ち時間が発生したら次のお客様に対応するため、少ない人数でも多くのお客様をさばけます。

この仕組みにより、Nginxは少ないメモリ消費で、数万から数十万の同時接続を処理できます。まさに、アクセスが集中するサイトに最適なソフトウェアです。

ロードバランサーが果たす「交通整理」の役割

Nginxはロードバランサーとしても優れた機能を持っています。ロードバランサーの役割を一言で表すなら、「交通整理」です。

道路の交通整理を思い浮かべてください。交差点に警察官が立って、車の流れを見ながら「こちらの道へ」「あちらの道へ」と誘導しています。これと同じように、ロードバランサーはユーザーからのリクエスト(アクセス)を見て、最適なサーバーへ振り分けます。

具体的には、以下のような役割を果たします

まず、稼働中のサーバーにのみリクエストを送ります。障害で停止しているサーバーには決してリクエストを送りません。これにより、ユーザーがエラー画面を見ることなく、常に正常なサーバーでサービスを受けられます。

次に、各サーバーの負荷状況を考慮して、リクエストを効率よく分散させます。1台のサーバーだけに負荷が集中することがないよう、バランスよく振り分けます。

さらに、サーバーの追加や削除を柔軟に行えます。アクセスが増えてきたらサーバーを追加し、落ち着いたら減らすといった調整が、サービスを止めることなく可能です。

リクエストを複数サーバーに振り分ける仕組み

では、Nginxのロードバランサーは実際にどのようにリクエストを振り分けるのでしょうか。基本的な流れを見ていきましょう。

ステップ1:ユーザーからのリクエストを受け取る

ユーザーがブラウザでWebサイトにアクセスすると、そのリクエストはまずNginxロードバランサーに届きます。Nginxはいわば「受付窓口」として、すべてのリクエストを一旦受け止めます。

ステップ2:適切なバックエンドサーバーを選択

Nginxは、あらかじめ設定されたルール(負荷分散アルゴリズム)に従って、リクエストを処理するサーバーを選択します。例えば、「順番に振り分ける」「処理中のリクエストが少ないサーバーを選ぶ」「同じユーザーは同じサーバーに送る」など、さまざまな方法があります。

ステップ3:選択したサーバーにリクエストを転送

選択されたバックエンドサーバーに、リクエストを転送します。このとき、Nginxはユーザーの情報(IPアドレスなど)も一緒に送ることで、バックエンドサーバーが正しく処理できるようにします。

ステップ4:サーバーからのレスポンスをユーザーに返す

バックエンドサーバーが処理を完了すると、その結果(Webページのデータなど)をNginxに返します。Nginxはそれを受け取り、ユーザーのブラウザに送り返します。

ユーザーから見ると、Nginxロードバランサーの存在は見えません。あたかも1台のサーバーと通信しているように感じます。しかし、裏側では複数のサーバーが協力して処理を分担しているのです。

この仕組みにより、アクセスが集中しても安定したレスポンスを維持でき、1台のサーバーがダウンしてもサービスを継続できる、強固なシステムが実現できます。

次に、実際にNginxでロードバランシングを実装する具体的な設定方法を見ていきましょう。

Nginxでロードバランシングを実装する基本設定

ここからは、実際にNginxでロードバランシングを設定する方法を解説します。この章を読めば、すぐに動作する設定ファイルを作成できるようになります。

難しそうに感じるかもしれませんが、基本的な設定は驚くほどシンプルです。順を追って見ていきましょう。

最小構成の設定例|upstreamとproxy_pass

Nginxでロードバランシングを実現するには、たった2つの要素を理解すれば十分です。それが「upstream」と「proxy_pass」です。

upstreamディレクティブは、リクエストを振り分ける先のサーバーグループを定義します。いわば「チームメンバーのリスト」です。

proxy_passディレクティブは、受け取ったリクエストをそのサーバーグループに転送する指示です。「このチームに仕事を任せる」という命令だと考えてください。

以下が最もシンプルな設定例です。

http {
    upstream backend {
        server 192.168.1.10:8080;
        server 192.168.1.11:8080;
        server 192.168.1.12:8080;
    }

    server {
        listen 80;

        location / {
            proxy_pass <http://backend>;
        }
    }
}

この設定を読み解いてみましょう。

upstream backend { ... } の部分で、「backend」という名前のサーバーグループを定義しています。この例では、3台のサーバー(192.168.1.10、192.168.1.11、192.168.1.12)をグループに登録しています。ポート番号の8080は、各サーバーでアプリケーションが動いているポートです。

server { listen 80; ... } の部分は、Nginx自身がポート80番(HTTP)でリクエストを受け付けることを意味します。

proxy_pass <http://backend>; で、受け取ったすべてのリクエストを、先ほど定義した「backend」グループに転送します。

この設定だけで、Nginxは3台のサーバーにリクエストを順番に振り分けるようになります。設定ファイルを保存して、Nginxを再起動すれば、すぐにロードバランシングが動き出します。

実務で必須の設定を追加する(ヘッダー転送・タイムアウト)

先ほどの最小構成でも動作しますが、実務で使うにはいくつかの設定を追加する必要があります。特に重要なのが、ヘッダーの転送とタイムアウトの設定です。

ヘッダー転送が必要な理由

バックエンドサーバーは、リクエストを送ってきたのが「ユーザー」なのか「Nginxロードバランサー」なのかを区別できません。何も設定しないと、すべてのリクエストがNginxから来たように見えてしまい、ユーザーの本当のIPアドレスやアクセス元の情報が失われます。

これを防ぐために、以下のヘッダーを転送する設定が必須です。

proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

Host ヘッダーは、ユーザーがアクセスした元のドメイン名を保持します。X-Forwarded-For は、ユーザーの実際のIPアドレスを記録します。X-Forwarded-Proto は、ユーザーがHTTPとHTTPSのどちらでアクセスしたかを伝えます。

タイムアウト設定で安定性を確保

バックエンドサーバーの応答が遅い場合や、障害で応答がない場合に備えて、タイムアウトを設定します。

proxy_connect_timeout 5s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;

proxy_connect_timeout は、バックエンドサーバーへの接続を確立する待ち時間です。5秒以内に接続できなければ、そのサーバーは問題があると判断します。

proxy_send_timeoutproxy_read_timeout は、データの送受信時のタイムアウトです。60秒応答がなければ、次のサーバーにリトライします。

リトライの設定

バックエンドサーバーがエラーを返した場合に、自動的に別のサーバーにリトライする設定も追加しましょう。

proxy_next_upstream error timeout http_502 http_503 http_504;

この設定により、ネットワークエラー、タイムアウト、502/503/504エラーが発生した場合、Nginxは自動的に次のサーバーにリクエストを送り直します。ユーザーはエラーを見ることなく、正常なサーバーからレスポンスを受け取れます。

コピペで使える完全な設定ファイル例

ここまでの内容をすべて含めた、実務でそのまま使える完全な設定ファイルを示します。

http {
    # バックエンドサーバーグループの定義
    upstream backend {
        server 192.168.1.10:8080;
        server 192.168.1.11:8080;
        server 192.168.1.12:8080;
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            # バックエンドサーバーへリクエストを転送
            proxy_pass <http://backend>;

            # ヘッダーの転送設定
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Real-IP $remote_addr;

            # タイムアウト設定
            proxy_connect_timeout 5s;
            proxy_send_timeout 60s;
            proxy_read_timeout 60s;

            # エラー時のリトライ設定
            proxy_next_upstream error timeout http_502 http_503 http_504;
        }
    }
}

この設定ファイルを /etc/nginx/nginx.conf または /etc/nginx/conf.d/loadbalancer.conf に保存します。IPアドレスとポート番号、ドメイン名(server_name)を自分の環境に合わせて変更してください。

設定ファイルを保存したら、以下のコマンドで設定の文法チェックを行います。

sudo nginx -t

「syntax is ok」と表示されれば、設定に問題ありません。次のコマンドでNginxを再起動します。

sudo systemctl reload nginx

これで、ロードバランサーが動き始めます。ブラウザで http://example.com にアクセスすると、3台のサーバーのいずれかが応答を返すようになります。

この基本設定をベースに、次の章では負荷分散の方法(アルゴリズム)を選択して、さらに最適化していきましょう。

負荷分散の方法(アルゴリズム)を選ぶ

基本的な設定でロードバランシングが動くようになりましたが、実はリクエストの振り分け方にはいくつかの方法があります。これを「負荷分散アルゴリズム」と呼びます。

どのアルゴリズムを選ぶかによって、システムの効率や安定性が大きく変わります。ここでは、Nginx OSSで使える3つの主要なアルゴリズムと、その使い分け方を解説します。

ラウンドロビン|順番に振り分けるデフォルト設定

ラウンドロビンは、Nginxのデフォルトの負荷分散方式です。先ほどの基本設定で、特に何も指定しなければ、この方式が自動的に使われます。

仕組みはとてもシンプルです。サーバーを円状に並べて、順番にリクエストを振り分けていきます。1番目のリクエストはサーバーA、2番目はサーバーB、3番目はサーバーC、そして4番目は再びサーバーAに戻る、という具合です。

upstream backend {
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

この設定では、3台のサーバーに均等にリクエストが分配されます。

ラウンドロビンのメリットは、設定が簡単で理解しやすい点です。各サーバーのスペックが同じで、処理時間もほぼ同じような場合には、非常に効果的に動作します。

ただし、注意点もあります。リクエストの処理時間がバラバラな場合、問題が起こる可能性があります。例えば、サーバーAが重い処理を実行中で、まだ2つのリクエストを処理している最中だとします。しかし、ラウンドロビンは処理状況を考慮せず、順番が来れば容赦なくサーバーAに新しいリクエストを送ります。結果として、サーバーAだけ過負荷になることがあります。

とはいえ、多くのWebアプリケーションでは、リクエストの処理時間はそれほど大きく変わりません。そのため、ラウンドロビンで十分に機能するケースが多いのも事実です。

最小接続数|処理中のリクエストが少ないサーバーを優先

最小接続数(least_conn)は、より賢い振り分け方式です。各サーバーが現在処理しているリクエストの数を監視し、最も少ないサーバーに新しいリクエストを送ります。

設定は、upstream ブロックに least_conn; を1行追加するだけです。

upstream backend {
    least_conn;
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

動作イメージを見てみましょう。サーバーAが3つのリクエストを処理中、サーバーBが1つ、サーバーCが2つのリクエストを処理中だとします。この状態で新しいリクエストが来ると、Nginxは最も空いているサーバーB(接続数1)にリクエストを送ります。

この方式の最大のメリットは、負荷の偏りを防げることです。処理に時間がかかるリクエストがあっても、自動的に空いているサーバーにリクエストが流れるため、全体のバランスが保たれます。

どんな場合に使うべきかというと、リクエストの処理時間にバラつきがある場合です。例えば、画像処理や複雑なデータベースクエリなど、重い処理が混在するWebアプリケーションでは、least_connを使うことで安定性が向上します。

また、各サーバーのスペックが異なる場合にも有効です。性能の低いサーバーには自然とリクエストが少なく割り当てられるため、全体として効率的な負荷分散が実現できます。

IPハッシュ|同じユーザーを同じサーバーに振り分ける

IPハッシュ(ip_hash)は、ユーザーのIPアドレスに基づいて振り分け先のサーバーを決定する方式です。同じIPアドレスからのリクエストは、常に同じサーバーに送られます。

設定は、upstream ブロックに ip_hash; を追加します。

upstream backend {
    ip_hash;
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

仕組みを説明します。NginxはユーザーのIPアドレスをハッシュ関数で計算し、その結果に基づいてサーバーを選択します。IPアドレスが変わらない限り、計算結果も同じなので、同じサーバーに振り分けられます。

なぜこの方式が必要なのかというと、セッション管理のためです。多くのWebアプリケーションでは、ログイン状態やショッピングカートの内容などを「セッション」として各サーバーのメモリに保存します。もしユーザーのリクエストが毎回違うサーバーに送られると、ログイン状態が失われたり、カートの中身が消えたりする問題が起こります。

IPハッシュを使えば、同じユーザーは常に同じサーバーにアクセスするため、セッション情報を維持できます。

ただし、デメリットもあります。ユーザーのIPアドレスが偏っている場合、負荷も偏ります。例えば、大企業の社員が同じプロキシサーバー経由でアクセスすると、すべて同じIPアドレスに見えるため、1台のサーバーに集中してしまいます。

また、サーバーを追加・削除すると、ハッシュの計算結果が変わり、ユーザーが別のサーバーに振り分けられる可能性があります。セッションが失われるリスクがあるため、運用時には注意が必要です。

現代的な解決策として、セッション情報をRedisなどの外部ストアに保存する方法があります。こうすれば、どのサーバーでリクエストを処理してもセッション情報にアクセスできるため、IPハッシュに頼る必要がなくなります。

どのアルゴリズムを選べばいいか?用途別の選び方

3つのアルゴリズムを紹介しましたが、実際にどれを選べばいいのでしょうか。用途別の選び方をまとめます。

ラウンドロビンを選ぶべき場合
  • すべてのサーバーのスペックが同じ

  • リクエストの処理時間がほぼ一定

  • シンプルな構成で管理したい

  • セッション管理が不要、またはアプリケーション側で対応済み

多くの一般的なWebサイトやAPIサーバーでは、ラウンドロビンで十分です。まずはこれから始めて、問題があれば他の方式に変更するのが良いでしょう。

最小接続数(least_conn)を選ぶべき場合
  • リクエストの処理時間にバラつきがある

  • 画像処理、動画変換など、重い処理が含まれる

  • 各サーバーのスペックが異なる

  • より均等な負荷分散を実現したい

処理が複雑なWebアプリケーションや、バックエンドで重い計算を行うシステムでは、least_connが効果的です。

IPハッシュ(ip_hash)を選ぶべき場合
  • セッション管理が必要で、外部ストアを使っていない

  • ユーザーを特定のサーバーに固定したい

  • アプリケーションの改修が難しく、サーバー側でセッションを保持するしかない

ただし、IPハッシュは最後の手段と考えてください。可能であれば、セッション情報を共有する仕組み(RedisやJWTトークンなど)を導入し、ラウンドロビンやleast_connを使う方が柔軟性が高く、運用しやすいシステムになります。

迷ったら、まずはラウンドロビンから始めましょう。設定も簡単で、多くの場合で十分に機能します。実際に運用してみて、負荷の偏りやセッションの問題が出てきたら、その時点で最適なアルゴリズムに切り替えれば良いのです。

次は、サーバー障害時の対応について解説します。

サーバー障害時の自動切り替えを設定する

ロードバランシングの設定ができても、サーバーが障害でダウンした場合の対策がなければ、システムの安定性は保てません。このパートでは、Nginxがサーバーの障害を自動的に検知し、正常なサーバーにのみリクエストを振り分ける仕組みを解説します。

万が一の障害に備えた設定を追加することで、サービスを止めない強固なシステムを構築できます。

ヘルスチェックでダウンしたサーバーを自動除外

Nginxには、バックエンドサーバーの健全性を監視する「ヘルスチェック」機能があります。ただし、NGINX OSSで使えるのは「パッシブヘルスチェック」と呼ばれる方式です。

パッシブヘルスチェックは、実際のリクエスト処理の結果を見て、サーバーの状態を判断します。定期的に自動で確認するわけではなく、ユーザーからのリクエストを処理する過程で、サーバーが正常かどうかをチェックする仕組みです。

設定は以下のように行います。

upstream backend {
    server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.12:8080 max_fails=3 fail_timeout=30s;
}

パラメータの意味を見ていきましょう。

max_fails=3 は、「3回連続で失敗したら、このサーバーを一時的に除外する」という設定です。失敗とは、接続エラーやタイムアウト、502/503/504などのエラーレスポンスを指します。

fail_timeout=30s は、「30秒間そのサーバーを除外し、30秒後に再び試す」という意味です。つまり、3回失敗したサーバーは30秒間使用されず、30秒経過後に再度リクエストが送られて復旧を確認します。

動作の流れをイメージしてみましょう。サーバーAで何らかの障害が発生したとします。最初のリクエストが失敗(1回目)、次のリクエストも失敗(2回目)、さらに次も失敗(3回目)すると、NginxはサーバーAを除外します。その後30秒間は、サーバーBとサーバーCだけでリクエストを処理します。30秒経過後、Nginxは再びサーバーAにリクエストを送って確認し、成功すればサーバーAを復帰させます。

この仕組みにより、ユーザーは障害の影響をほとんど受けません。最初の3回のリクエストは失敗する可能性がありますが、先ほど設定した proxy_next_upstream によって自動的に別のサーバーにリトライされます。つまり、ユーザーがエラーを目にする可能性は極めて低くなります。

パラメータの調整ポイントも知っておきましょう。max_fails を小さくすれば、障害の検知が早くなりますが、一時的なネットワークの揺らぎでもサーバーが除外されやすくなります。逆に大きくすれば、誤検知は減りますが、障害の検知が遅れます。一般的には3〜5が適切です。

fail_timeout を短くすれば、障害から復旧した際に早く戻せますが、まだ不安定なサーバーに早々にリクエストが送られるリスクがあります。30秒〜60秒程度が標準的な設定です。

なお、NGINX Plus(商用版)では、定期的に自動でサーバーの状態を確認する「アクティブヘルスチェック」が使えますが、NGINX OSSでは利用できません。しかし、実務上はこのパッシブヘルスチェックで十分に対応できます。

バックアップサーバーで障害時も安定稼働

もう一つの重要な設定が、バックアップサーバーです。これは、すべてのメインサーバーが障害でダウンした場合の最後の砦として機能します。

設定は、サーバーの定義に backup パラメータを追加するだけです。

upstream backend {
    server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.12:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.13:8080 backup;
}

この設定では、192.168.1.10〜12の3台がメインサーバー、192.168.1.13がバックアップサーバーです。

通常時の動作では、バックアップサーバーにはリクエストが送られません。3台のメインサーバーだけでリクエストを処理します。バックアップサーバーは待機状態です。

障害時の動作を見てみましょう。何らかの理由で3台のメインサーバーがすべてダウンしたとします。この時、Nginxは自動的にバックアップサーバーにリクエストを送り始めます。処理能力は下がるかもしれませんが、サービスは継続できます。

そして、メインサーバーのいずれかが復旧すると、Nginxは再びメインサーバーを使い始め、バックアップサーバーは待機状態に戻ります。

実務での活用方法としては、以下のようなパターンがあります。

スペックの低いサーバーをバックアップとして配置する方法です。通常時は使わないので、コストを抑えられます。緊急時には性能が落ちても、サービスが止まるよりはマシです。

また、バックアップサーバーを別のデータセンターに配置することで、災害対策にもなります。メインのデータセンターが丸ごとダウンしても、別拠点のバックアップサーバーでサービスを継続できます。

さらに、メンテナンス時にも活用できます。メインサーバーを順次メンテナンスしている間、バックアップサーバーが稼働することで、サービスを止めずに作業できます。

注意点として、バックアップサーバーも定期的に動作確認をしましょう。いざという時に動かなければ意味がありません。定期的にメインサーバーを手動で停止し、バックアップサーバーが正常に動作するかテストすることをお勧めします。

これらの設定により、単一障害点を排除し、高可用性を実現するシステムが完成します。メインサーバーが障害でダウンしても、自動的に切り替わり、ユーザーは何事もなかったかのようにサービスを利用できます。

次に、これまでの内容をまとめて、Nginxロードバランサー導入のポイントを振り返ります。

まとめ|Nginxで始めるシンプルで確実な負荷分散

ここまで、Nginxを使ったロードバランシングの基本から実装方法まで解説してきました。最後に、重要なポイントを振り返りましょう。

サーバーの負荷分散が必要な理由

1台のサーバーだけでシステムを運用していると、アクセス集中時に過負荷でダウンするリスクがあります。特に、ECサイトのセールやキャンペーン時には、このリスクが現実のものになります。複数のサーバーとロードバランサーを組み合わせることで、負荷を分散し、1台がダウンしてもサービスを継続できる強固なシステムを構築できます。

Nginxロードバランサーの強み

Nginxは、オープンソースで無料ながら、世界中の大規模サイトで採用されている実績があります。非同期イベント駆動アーキテクチャにより、少ないリソースで大量の同時接続を処理できます。設定もシンプルで、upstreamとproxy_passの2つの要素を理解すれば、すぐに動作するロードバランサーを構築できます。

実装の基本ステップ

まず、upstreamブロックでバックエンドサーバーのグループを定義し、proxy_passでリクエストを転送します。これが最小構成です。実務で使うには、ヘッダーの転送設定(Host、X-Forwarded-For、X-Forwarded-Proto)とタイムアウト設定(proxy_connect_timeout、proxy_read_timeout)を追加します。さらに、proxy_next_upstreamでエラー時の自動リトライを設定すれば、より安定したシステムになります。

負荷分散アルゴリズムの選び方

デフォルトのラウンドロビンは、サーバーに順番にリクエストを振り分けます。シンプルで理解しやすく、多くの場合で十分に機能します。リクエストの処理時間にバラつきがある場合や、サーバーのスペックが異なる場合は、最小接続数(least_conn)を使いましょう。セッション管理が必要で、外部ストアを使えない場合のみ、IPハッシュ(ip_hash)を検討します。迷ったら、まずはラウンドロビンから始めるのが賢明です。

障害対策で可用性を高める

max_failsとfail_timeoutを設定することで、障害が発生したサーバーを自動的に除外できます。一般的には、max_fails=3、fail_timeout=30sが適切です。さらに、backupパラメータでバックアップサーバーを用意すれば、すべてのメインサーバーがダウンしても、サービスを継続できます。

最初の一歩を踏み出そう

ロードバランシングは難しそうに感じるかもしれませんが、Nginxなら驚くほどシンプルに実装できます。この記事で紹介した設定をコピーして、自分の環境のIPアドレスとポート番号に書き換えるだけで、すぐに動き始めます。

まずは小さく始めてみましょう。テスト環境で2台のサーバーを使ってロードバランシングを試してみてください。動作を確認したら、本番環境に展開し、サーバーを増やしていけば良いのです。

システムの成長に合わせて拡張できる

Nginxロードバランサーの最大の利点は、柔軟性です。ビジネスが成長してアクセスが増えたら、設定ファイルにサーバーを追加するだけで処理能力を増やせます。逆に、アクセスが落ち着いた時期にはサーバーを減らしてコストを最適化できます。サービスを止めることなく、システムを成長させられるのです。

Nginxでロードバランシングを導入することは、単なる技術的な改善ではありません。ビジネスの機会損失を防ぎ、ユーザーに安定したサービスを提供し、企業の信頼を守る重要な投資です。

この記事で学んだ知識を活かし、今日からでもロードバランシングの導入を検討してみてください。システムの安定性と拡張性が向上し、ビジネスの成長を支える強固な基盤が手に入ります。

Rabilooのシステム開発サービス

Rabilooは、ベトナムを拠点とするソフトウェア開発企業です。Nginxを含む最新のテクノロジーを活用したWebアプリケーション開発とシステム最適化に豊富な経験を持っています。

高トラフィックに耐えるシステム設計、ロードバランシングの実装、パフォーマンス改善など、お客様のビジネスニーズに合わせた効率的なソリューションを提供します。システムの安定性向上やスケーラビリティの改善にお悩みの方は、ぜひRabilooにご相談ください。

▶︎システムパフォーマンス改善はこの3つをやればOK!

▶︎React Nativeのパフォーマンスを向上させる基本的な方法

 


Share


Kakimoto Kota
Rabilooのオウンドメディアで制作ディレクターを担当。日越翻訳、記事、動画、SNS、コンテンツの戦略立案から制作まで行う。2015年よりベトナム・ハノイ在住

お問い合わせ

選択してください