ApacheサーバでRewriteしてメンテナンス画面を表示させる
稼働中のWebアプリで一旦メンテナンス画面を表示させて、その間に新しいバージョンをデプロイしたいことがあります。
Apacheだとmod_rewriteを使い全てのリクエストに対してメンテナンス画面のURLに書き換えるか、メンテナンス画面のURLにリダイレクトさせれば良いです。
URLを書き換える単純な例だとこんな感じに。
RewriteEngine on RewriteRule .* /maintenance.html
こちらはリダイレクトする例。リダイレクトする場合はRewriteRuleのオプションに[R]を指定します。
同一ドメインにリダイレクトする場合、RewriteCondでリダイレクト先のパスを除外しないとリダイレクトループが発生するので注意です。
RewriteEngine on RewriteCond %{REQUEST_URI} !=/maintenance.html RewriteRule .* /maintenance.html [R]
システムメンテナンスの時はレスポンスコード503を返すようなので、RewriteRuleのオプションに[R=503]を追加してみます。
メンテナンス画面のURLはRewriteRuleではなく、ErrorDocumentで指定します。
この場合もRewriteCondでErrorDocumentで指定したパスを指定しないと、Apacheのデフォルトのエラーページが返ってしまいます
ErrorDocument 503 /maintenance.html RewriteEngine on RewriteCond %{REQUEST_URI} !=/maintenance.html RewriteRule .* /anywhere(何でも良い) [R=503]
最後にドキュメントルートとメンテナンス画面のディレクトリが別の場合の例も。
Aliasディレクティブで/maintenance.htmlというパスをドキュメントルートとは別の/var/www/error/maintenance.htmlというパスに対応させます。
ErrorDocument 503 /maintenance.html Alias /maintenance.html /var/www/error/maintenance.html RewriteEngine on RewriteCond %{REQUEST_URI} !=/maintenance.html RewriteRule .* /anywhere(何でも良い) [R=503]
実際に使う場合、上の設定ファイルを/etc/httpd/conf.d/maintenance.conf.no_maintenanceといった名前で作成します。
そして通常時には設定ファイルをApacheに読み込ませない様にしておいて、メンテナンス時には設定ファイル名を変更しApacheを再起動するスクリプトを叩いて設定ファイルを読みこませればOKです。