さくらのクラウド ネットワーク入門 7. ロードバランサーでWebサーバーを負荷分散してみよう

公開:最終更新日:

一般にロードバランサーとは、サーバーリソースの負荷分散を実現するネットワーク機器です。例えばアクセス過多なWebサービスに対し、Webサーバーやアプリケーションサーバーを複数起動して処理を振り分ける際に利用されます。本サイトの用語解説「負荷分散とは?」も参照してください。

ロードバランサーは構成や仕組みによっていくつか種類がありますが、さくらのクラウドでは3つのアプライアンスを提供しています。特徴を簡単にまとめると次の図のようになります。

アプライアンス名特徴提供範囲
ロードバランサL4(TCP)で動作し、スイッチ配下に設置するDSR方式同一ゾーン内のみで有効
エンハンスドロードバランサL7(HTTP)で動作し、グローバルネットワークに設置するプロキシー方式ゾーンをまたぐ運用が可能
GSLBDNSベースで動作し、広域負荷分散(GSLB)を提供リージョンやゾーンをまたぐ運用が可能

より詳細な比較については、商用アプライアンス製品を含めた4種類についてマニュアルの「よくある質問と回答」に掲載しています。

👉 4種類のロードバランサアプライアンスの違いは何ですか? – よくある質問と回答 – アプライアンス

このネットワーク入門シリーズで、順番に1つずつ設定してみながら手順を紹介していきます。本記事では「ロードバランサ」アプライアンスを取り上げます。

目次
  1. さくらの「ロードバランサ」はどんなロードバランサーか?
    1. DSR方式とは何か?
  2. ネットワークをどのように構成するか?
  3. Webサーバーを起動する
  4. ロードバランサーを起動して設定する
    1. VIPを設定する
    2. Webサーバーで必要なネットワーク設定
    3. 負荷分散されていることを確認する
  5. ソーリーページを設定しよう
    1. ロードバランサーでソーリーページを設定する
    2. ソーリーサーバーの設定
    3. Webサーバーを停止してテストする
  6. 付記・DSR方式によるアクセスログ

さくらの「ロードバランサ」はどんなロードバランサーか?

ロードバランサ」は、TCPレイヤー(L4)での負荷分散を提供する仮想的なアプライアンス機器です。さくらのクラウドの同一ゾーンで構築されたネットワークに、コントロールパネル上の操作から手軽にロードバランサーを追加できます。設定方法の詳細などは次のマニュアルも参照してください。

👉 ロードバランサ | さくらのクラウド マニュアル

処理性能により「標準プラン」と「ハイスペックプラン」があり、また冗長化の有無で「シングル構成」と「冗長構成」が選べるため、掛け合わせで都合4プランから選択できます。この冗長化は、複数のルーターで仮想IPを共有して障害時の自動切り替えを実現するVRRP(Virtual Router Redundancy Protocol)により実装されます。それぞれのプランの違いは、マニュアルの「仕様」を参照してください。

本記事では、マニュアルの「構成例」にある「ルータ+スイッチを組み合わせたWebサーバの負荷分散」(下図)の「ロードバランサ2」がない「シングル構成」バージョンを作成してみます。

DSR方式とは何か?

さくらの「ロードバランサ」では、DSR(Direct Server Return)方式により通信が制御されます。DSR方式のロードバランサーはリクエストの転送のみを行い、レスポンスはサーバーが直接クライアントへ返します。これには次のようなメリットがあります。

  • ロードバランサーをレスポンスの経路から外すことができるため、その負荷を軽減できる
  • レスポンスはサーバーが直接返すため、ロードバランサーの仕様に縛られず自由に設計できる
  • サーバーは直接クライアントと通信を確立するため、クライアントのIPアドレスを識別できる

一方、DSR方式ではサーバーとロードバランサーが同一ネットワーク上になければいけません。つまり、さくらのクラウドでは同じゾーンの同じスイッチにつながっている必要があります。

また注意点として、ロードバランサー配下のサーバーからゲートウェイに直接レスポンスが戻るため、通信のリクエスト元とレスポンス先が異なります。リクエスト経路とレスポンス経路が非対称になりますから、各サーバーでネットワーク設定の手間が発生します。

ネットワークをどのように構成するか?

前述した図のネットワークを構成するため、インターネットと接続するルーターと配下のスイッチをまとめて、ネットワーク入門シリーズの第5回で取り上げた「スイッチ+ルータ」を起動します。

👉 さくらのクラウド ネットワーク入門 5. L3スイッチを「ルータ+スイッチ」で実現する

このスイッチに2台のWebサーバーと1台のロードバランサーを接続しますが、それぞれに割り当てるIPアドレスを先に決めておきましょう。上記記事にあるように「スイッチ+ルータ」ではIPv4のアドレスブロックが割り当てられます。ここでは仮に次のアドレスブロックだったとします。

133.125.233.208/28

このネットワークでは 133.125.233.209 から 133.125.233.222 まで、14個のIPアドレスを機器に割り当てることができます。上記記事にもあるように「スイッチ+ルータ」ではゲートウェイアドレスのほか2個を内部的に使用します。

また、後で説明しますが「ロードバランサ」では物理アドレスと仮想アドレス(VIP)が必要です。何台起動しても同一のVIPで認識されるため、冗長化された2台構成であれば合計3つ、1台構成でも2つのIPアドレスを消費します。

さらに記事の後半でソーリーサーバーを設定するため、まとめると今回は次の表のようにIPアドレスを使用することとします。読者の皆さんも自身の環境にあわせて割り当てるIPアドレスを決めておくとよいでしょう。

機器・用途IPアドレス
ゲートウェイ133.125.233.209
(内部使用)133.125.233.210
(内部使用)133.125.233.211
Webサーバー A133.125.233.212
Webサーバー B133.125.233.213
ソーリーサーバー133.125.233.214
ロードバランサー VIP133.125.233.216
ロードバランサー 物理IP133.125.233.222

それでは順に起動していきましょう。

Webサーバーを起動する

これまでのネットワーク入門シリーズでは仮想デバイスによるネットワーク構成を扱ってきましたが、今回はWebの負荷分散のためWebサーバーを立ち上げます。さくらのクラウドで「サーバ」を起動して「スイッチ+ルータ」に接続する方法は上記記事を参照してください。なお、OSのディスクイメージとしてはUbuntu Server 22系のLinuxディストリビューションを選択したものとします。

スイッチに接続した「サーバ」にSSHでログインし、以下のような手順でnginx(Webサーバー)をインストールして起動します。

$ sudo apt update
$ sudo apt install -y nginx
$ sudo systemctl start nginx

Webサーバーそれぞれに割り当てたIPアドレスにWebブラウザでアクセスして、次のように表示されることを確認してください。

ここではAとBのどちらにアクセスしているか区別がつきやすいように、表示されるテキストを少し変更しています。次のようにHTMLファイルをエディタで開き、本文の h1 要素に「from ServerA」や「from ServerB」と追記しておくとよいでしょう。

$ sudo vi /var/www/html/index.nginx-debian.html

WebサーバーAとWebサーバーBの両方を設定し終えたら、次にロードバランサーを設定します。

ロードバランサーを起動して設定する

次にロードバランサーを起動します。コントロールパネルの左メニューから「アプライアンス」を開いて「ロードバランサ」を選択します。

一覧画面で右上の「+追加」をクリックし、ロードバランサーを起動します。ここでは「標準プラン」を選択し、また「冗長化」は「いいえ」でシンプルな1台構成としています。

このとき、前述の表にある物理IPの値を「IPv4アドレス」に入力します。前述のネットワークアドレスに沿って「ネットマスク」なども指定してください。また同一の「VRID」を設定された機器が、同じVRRPグループに登録されます。右下の「+作成」をクリックします。

VIPを設定する

続けてロードバランサーとしてのVIP(仮想IPアドレス)を設定します。作成した「ロードバランサ」の詳細画面から「VIP設定」タブを開いて「+追加」をクリックします。

前述の表にあるVIPを「VIPアドレス」に入力します。あわせて待ち受ける「ポート番号」なども指定してください。

次に「実サーバ」タブを開いて「+追加」をクリックし、先ほど起動した2つのWebサーバーを追加します。

Webサーバーそれぞれの「IPアドレス」を設定します。また「監視方法」には「ping」を選びます。設定できたら「追加」をクリックします。

AとBの2つとも追加できたら、最後に画面右上の「反映」をクリックします。

しばらく待つとヘルスチェックが通り、Webサーバーにロードバランサー経由でアクセスできるようになります。それぞれの「ステータス」が「UP」になっていることを確認してください。

なお、ヘルスチェックが通らないサーバが存在する場合、ロードバランサーは自動でリクエストのルーティング先からそのサーバを一時的に除外します。

Webサーバーで必要なネットワーク設定

前述の通り、DSR方式ではWebサーバに対するリクエスト元のIPアドレス(ロードバランサー)と、レスポンス先のIPアドレス(ルーターのゲートウェイ)が異なります。このため2台のWebサーバでは、以下のようなネットワーク設定が必要になります。

まず /etc/sysctl.conf に以下の2行を追加します。

net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

追記後、設定内容を反映します。

$ sudo sysctl -p

次に /etc/netplan/01-netcfg.yaml を以下の内容に置き換えます。

 # This file describes the network interfaces available on your system
 # For more information, see netplan(5).
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no
      nameservers:
        addresses: [133.242.0.3, 133.242.0.4]
        search: [localdomain]
      addresses:
        - 133.125.233.212/28
      routes:
        - to: default
          via: 133.125.233.209
    lo:
      match:
        name: lo
      addresses:
        - 133.125.233.216/32

これは「ロードバランサ」のマニュアルにある「Ubuntu系の手順」の記載とは異なり、上記がUbuntu 22での書式となります。

編集が終われば、設定内容を反映させます。

$ sudo netplan apply

もう1台のWebサーバでも同じように作業します。

負荷分散されていることを確認する

いよいよテストです。Webサーバーにブラウザからアクセスしてみましょう。先ほどはWebブラウザのIPアドレスに直接アクセスしましたが、今回はロードバランサーのVIPにアクセスします。先ほどと同じnginxの画面が表示されれば成功です。ここではWebサーバーAに振り分けられています。

もう一方のWebサーバーに接続されることも確認したいのですが、いったんコネクションが確立するとしばらく維持されるため、同じブラウザで連続的にアクセスしても同じWebサーバーに誘導され続けます。ブラウザを変えるなど複数の環境からアクセスしてみると、AとBが出し分けられていることが確認できるでしょう。

ソーリーページを設定しよう

ロードバランサーにはソーリーページ(sorry page)機能があります。メンテナンスや障害でWebサイトが表示できないときに、代替で「ただ今、つながりにくくなっています」などとユーザーに状況を伝えるページです。

事前に設定しておくことで、ターゲットとして登録されているWebサーバがすべて反応しないときや、メンテナンスなどで意図的にユーザーからのリクエストをシャットアウトしたいときに一時的なメッセージを表示させることができます。

ロードバランサーでソーリーページを設定する

ソーリーページを設定するには「ロードバランサ」の「VIP設定」画面を開きます。

詳細画面でソーリーサーバーのIPアドレスを入力します。指定できるソーリーサーバーは「スイッチ+ルータ」が管理しているIPアドレス内になければなりません。ここでは前述の表にある値を「ソーリーサーバ」に設定しています。

ソーリーサーバーの設定

ソーリーサーバーは、Webサーバーがすべて接続できないときにメッセージを配信するため、別のWebサーバーを立ち上げておく必要があります。新たに「サーバ」を起動して先ほどと同様にnginxを設定します。起動時のIPアドレスは、先ほど「ロードバランサ」の詳細画面で設定した値と同じにします。

また、ソーリーサーバーもターゲットのWebサーバーと同様にDSR方式で通信がハンドリングされるため、非対称ルーティングとなります。前述のWebサーバーと同じネットワーク設定を書き込んでおいてください。

さらに index.nginx-debian.html を編集して、つながらない理由などが表示されるようにします。例えば h1 要素を「Sorry in maintenance」のように書き換えておくとよいでしょう。

Webサーバーを停止してテストする

ソーリーページが表示されるかテストしてみましょう。意図的にメンテナンス状態を作ります。コントロールパネルから2台のWebサーバーの電源を落としてください。

このようにWebサーバを停止させると、ロードバランサーのヘルスチェックもすべて失敗する(DOWN)ようになります。

この状態で、先ほどと同じようにロードバランサーのVIPにWebブラウザからアクセスします。次のようにソーリーサーバーで設定したHTMLドキュメントが返ってくることを確認してください。

内部的には、本来のWebサーバーが2台とも落ちているので、ソーリーサーバーとして設定されたWebサーバーからコンテンツが戻されているのです。

👉 ロードバランサにソーリーサーバを追加 | さくらのクラウド マニュアル

付記・DSR方式によるアクセスログ

記事の前半であげたDSR方式のメリットの1つに、Webサーバーが直接的にクライアントとセッションを確立するため、クライアント情報(IPアドレスやユーザーエージェントなど)が得られることがあります。実際には以下のようなアクセスログとして記録されます。

$ more /var/log/nginx/access.log
219.104.132.56 - - [25/Oct/2025:19:48:57 +0900] "GET / HTTP/1.1" 200 406 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36

ここでは 219.104.132.56 がクライアントのIPアドレスになり、これをもとにアクセス制御などを行うことができます。