Apache設定で簡易的にメンテナンス画面に切り替えよう

メンテナンス画面の切り替えは、皆様どうしてますか?今回は業務で使っている簡易的にメンテナンス画面に切り替える方法を記載します。仕組みとしてはApache設定を施すことにより、フラグファイル(空ファイル)を所定の場所に作成することでメンテナンス画面に切り替えられるというもの。また、今回は特定のIPは除外(メンテナンス画面を表示させず通常画面のまま)する設定も入れていきます。スクリプトを実行する必要もないですし、メンテ解除もフラグファイルを削除するだけと、とても便利。

< 前提 >

Apacheを使用

・メンテナンスページのコンテンツのパス: /var/www/html/sample.jp/common/error_maintenance.html

・下記 IP からのアクセスはメンテナンスページは表示されない: A.A.A.A、B.B.B.B

・フラグファイル名と配置場所: /opt/sample/conf/sample.maint.flag

< メンテナンス画面設定手順 >

1. Apache設定

Apacheのvhosts用の設定ファイルを以下のように設定する(VirtualHost部分切り出し)

<VirtualHost *:80>
  ServerName sample.jp
  ServerAlias www.sample.jp
  DocumentRoot /var/www/html/sample.jp
  ErrorLog /var/log/httpd/sample.jp-error_log
  CustomLog /var/log/httpd/sample.jp-access_log combined
  ErrorDocument 503 /common/error_maintenance.html

  RewriteEngine On
  RewriteCond %{HTTP_HOST} ^www\.sample\.jp$
  RewriteRule ^(.*) https://sample.jp$1 [R=301,L]

  RewriteCond /opt/sample/conf/sample.jp.maint.flag -f
  RewriteCond %{REMOTE_ADDR} !^A.A.A.A
  RewriteCond %{REMOTE_ADDR} !^B.B.B.B
  RewriteCond %{REQUEST_URI} !=/common/error_maintenance.html
  RewriteCond %{REQUEST_URI} !^.*\.(js|css|gif|jpg|png|ico)$
  RewriteRule .* - [R=503,L]
  <Directory "/var/www/html/sample.jp">
    AllowOverride All
  </Directory>
</VirtualHost>

<< 解説 >>

▼ フラグファイル存在条件

  RewriteCond /opt/sample/conf/sample.jp.maint.flag -f

▼ IP除外設定

  RewriteCond %{REMOTE_ADDR} !^A.A.A.A
  RewriteCond %{REMOTE_ADDR} !^B.B.B.B

▼ 表示用メンテナンスページ設定

  RewriteCond %{REQUEST_URI} !=/common/error_maintenance.html
  RewriteRule .* - [R=503,L]

2. Apache設定反映

# systemctl httpd.service reload

< メンテナンスページ表示手順 >

1. EC2にSSHログイン

2. メンテナンスフラグファイルを配置

$ sudo touch /opt/sample/conf/sample.maint.flag

3. 動作確認

サイトトップページ(https://www.sample.jp)にアクセスし、以下の挙動になることを確認

指定IPのアクセス: メンテナンスページが表示されないこと
指定IP以外のアクセス: メンテナンスページが表示されること

< メンテナンスページ解除手順 >

メンテナンスフラグファイルを削除

$ sudo rm -f /opt/sample/conf/sample.maint.flag

★参考サイト:

www.sakurasaku-labo.jp