皆さんこんにちは!新人のアナサピです!
今回は、さくらのクラウドのエンハンスドロードバランサを使って、Apacheを起動したままメンテナンス用の応答へ切り替えてみました。
Webサイトのメンテナンス中に、通常のページではなく「現在メンテナンス中です」と案内を出したいことがあると思います。 そのためだけにWebサーバ側のファイルや設定を変更するのではなく、ロードバランサ側の設定だけで切り替えられるのでしょうか。
そこで今回は、エンハンスドロードバランサの「固定レスポンス」を使って、変更前後のHTTP応答を確認してみます!
今回やること
流れは大まかに以下の通りです。
- Apacheで確認用のページを用意する
- エンハンスドロードバランサ経由で通常のページが返ることを確認する
- 固定レスポンスを設定して、対象のページだけをメンテナンス表示へ切り替える
- 対象外のページやApacheへの直接アクセスも確認する
- Apacheやサーバ自体を停止した場合の確認
今回はサイト全体ではなく、/index.html だけを対象にします。 切り替えるページと、そのまま返すページを分けることで、設定の影響を確認していきます。
検証環境
今回は、エンハンスドロードバランサ1台とApacheを動かすサーバ1台を使用しました。
| 項目 | 内容 |
|---|---|
| エンハンスドロードバランサ名 | TestLB |
| 待受設定 | HTTP・80番ポート |
| 実サーバ | Webサーバ1台 |
| Webサーバ | Apache 2.4.63 |
| 切替対象 | /index.html |
| 対象外の確認用ファイル | /health-c.txt |
本文では、エンハンスドロードバランサのVIPを ELB_IP、実サーバのIPアドレスを WEB_IP と表記します。
通常時のアクセス経路は以下の通りです。
curl → エンハンスドロードバランサ(HTTP/80)→ web(Apache/80)
今回使う固定レスポンスは、条件に一致したリクエストに対して、エンハンスドロードバランサ側に設定したステータスコードや本文を返す機能です。機能の詳細については、公式マニュアルもご確認ください。
Apacheで確認用のページを用意する
まずは、実サーバ側の準備から行っていきます。
現状はApacheとcurlを用意し、Apacheを起動しています。
まずは応答を見分けるためのファイルを2つ置きます。
[root@web ~]# echo "Apache OK" > /var/www/html/index.html
[root@web ~]# echo "HEALTH" > /var/www/html/health-c.txt
[root@web ~]# cat /var/www/html/index.html /var/www/html/health-c.txt
Apache OK
HEALTH
[root@web ~]#
index.html は今回の切替対象、health-c.txt は対象外の応答確認に使います。
サーバ自身から、まずは通常のページが返るか確認します。
[root@web ~]# curl -i http://127.0.0.1/index.html
HTTP/1.1 200 OK
~省略~
Content-Type: text/html; charset=UTF-8
Apache OK
[root@web ~]#
想定通り、ステータス200で「Apache OK」が返ってきました。
こちらを通常時の応答として、エンハンスドロードバランサの設定前後で比較していきます。
エンハンスドロードバランサを設定する
コントロールパネルの「グローバル → エンハンスドLB」から、検証用のエンハンスドLBを作成します。 今回は TestLB という名前を付けました。
待受ポートを設定
「待受ポート」タブから「追加」を選択し、以下の内容を設定します。

エンハンスドロードバランサで実サーバを登録
続いて「実サーバ」タブから「追加」を選択し、先ほどApacheを用意したサーバを登録します。

ここで指定するポート番号は、実サーバのApacheが待ち受けているポートです。今回は80番にそろえています。
また、HTTP監視のパスは、実サーバ側に置いたファイルと同じ /health-c.txt にそろえます。
設定後は、画面上部の「反映」をクリックし設定適用していきます。
変更前の応答を確認
それでは、エンハンスドLBのVIPへアクセスしてみます。
[root@web ~]# curl -i http://ELB_IP/index.html
HTTP/1.1 200 OK
~省略~
server: Apache/2.4.63 (Rocky Linux)
~省略~
content-type: text/html; charset=UTF-8
via: 1.1 sac-elb
Apache OK
[root@web ~]#
エンハンスドLB経由でも 200 OK と Apache OK が返ってきました。
これで、エンハンスドLBから実サーバへ通常の転送ができていることを確認できました。
固定レスポンスを設定する
ここから、対象のページをメンテナンス用の応答に切り替えていきます。 Apacheのファイルやサービスには手を加えず、エンハンスドLBの「ルール」タブから設定します。
「追加」を選択し、今回は以下の内容にしました。
| 項目 | 設定内容 |
|---|---|
| ホストヘッダ | 空欄 |
| パス | /index.html |
| 送信元IP | 空欄 |
| リクエストヘッダ名・値 | 空欄 |
| アクション | 固定レスポンス |
| ステータスコード | 503 Service Unavailable |
| コンテンツタイプ | text/html |
| コンテンツボディ | 下記のHTML |
<h1>Maintenance</h1><br>
LBTest

今回のポイントは、パスを /index.html に限定していることです。 すべてのページを切り替える設定にはしていないため、対象外の /health-c.txt と比較できます。
変更後の応答を確認
切替対象のページにアクセス
先ほどと同じURLへアクセスします。
[root@web ~]# curl -i http://ELB_IP/index.html
HTTP/1.1 503 Service Unavailable
cache-control: private, no-store
content-type: text/html
connection: close
<h1>Maintenance</h1><br>
LBTest
[root@web ~]#
先ほどは 200 OK と Apache OK でしたが、今回は 「503 Service Unavailable」 と、エンハンスドLBに設定した本文が返ってきました!
Apacheの index.html を書き換えなくても、エンハンスドLB側の設定で応答を切り替えられたことが分かります。 本文に入れた LBTest も返っているため、通常転送が失敗しただけの503とは区別できます。
対象外のページにアクセス
続いて、ルールに指定していない /health-c.txt へアクセスします。
[root@web ~]# curl -i http://ELB_IP/health-c.txt
HTTP/1.1 200 OK
~省略~
server: Apache/2.4.63 (Rocky Linux)
~省略~
content-type: text/plain; charset=UTF-8
via: 1.1 sac-elb
HEALTH
[root@web ~]#
こちらは通常通り 200 OK と HEALTH が返ってきました。
同じエンハンスドLBにアクセスしていても、/index.html は保守応答、/health-c.txt はApacheの通常応答になっています。 今回指定したパスだけが切り替わり、対象外のページへの転送は続いていることを確認できました。
Apacheへ直接アクセス
エンハンスドLBを通さず、実サーバ自身からApacheへ直接アクセスする確認も行いました。 確認に使うコマンドは以下です。
[root@web ~]# curl -i http://127.0.0.1/index.html
HTTP/1.1 200 OK
~省略~
Content-Type: text/html; charset=UTF-8
Apache OK
[root@web ~]#
直接アクセスでは 200 OK と Apache OK が返ることを確認しました。エンハンスド LB経由ページはメンテナンスとなっておりましたが、サーバ自身からのアクセスではApacheが通常応答を返すことを確認できました。
追加検証:Apacheを停止しても保守応答は返る?
ここまではApacheを動かしたまま、エンハンスドLB側の応答を切り替えました。 では、保守表示に切り替えた後、実際にApacheを停止するとどうなるのでしょうか。
メンテナンス中には、Webサーバのサービスを停止する作業も考えられます。 そこで追加で、固定レスポンスを有効にした状態でApacheを停止してみました。
まず、Apacheが起動していることを確認してから停止します。
[root@web ~]# systemctl is-active httpd
active
[root@web ~]# systemctl stop httpd
[root@web ~]# systemctl is-active httpd
inactive
[root@web ~]#
この状態で、もう一度エンハンスドLBの切替対象へアクセスします。
[root@web ~]# curl -i http://ELB_IP/index.html
HTTP/1.1 503 Service Unavailable
cache-control: private, no-store
content-type: text/html
connection: close
<h1>Maintenance</h1><br>
LBTest
[root@web ~]#
Apacheを停止していても、変わらず固定レスポンスが返って来たことを確認しました。
同じ503でも、今回はエンハンスドLBに設定した Maintenance と LBTest が返っています。 今回確認したタイミングでは、Apacheの稼働に頼らず、エンハンスドLBの固定レスポンスを取得できることが分かりました。
サーバを停止しても固定レスポンスが返ってくるのか
ここまでの確認では、webサーバを稼働した状態で実行していましたが、次にサーバを停止した状態ではどうなるか確認します。
サーバ停止を確認後、手元のWindows PCのPowerShellから、エンハンスドLBへアクセスしてみます。
PS C:\> curl.exe -i http://ELB_IP/index.html
HTTP/1.1 503 Service Unavailable
cache-control: private, no-store
content-type: text/html
connection: close
<h1>Maintenance</h1><br>
LBTest
PS C:\>
こちらも 「503 Service Unavailable」 と、設定した Maintenance、LBTest が返ってきました。
サーバ停止を伴う作業でも問題がないことがわかります。
まとめ
今回は、エンハンスドロードバランサの固定レスポンスを使って、Apacheを起動したままメンテナンス用の応答へ切り替えてみました。
今回の条件では、Webサーバ側にメンテナンス用のファイルを置き直さずに、エンハンスドロードバランサ側の設定だけで対象パスの応答を切り替えられました。 また、対象外のページは通常通り返せることも確認できました。
また、サーバ内のApacheやサーバ事態を停止した際にも、対象パスではエンハンスドロードバランサに設定した503応答を取得できました。
メンテナンス表示を出したい時に、Webサーバ側を変更する以外の方法として、実際の設定画面と応答を確認できたのは勉強になりました!
最後までご覧いただきありがとうございました!