Apache httpd でメンテナンスモード

設定した内容を忘れないようにメモ。

実現したいこと

ドキュメントルートに maintenance.html というファイルが存在すれば、メンテナンスモードとし、すべてのアクセスに対して maintenance.html を返す。
ただし、特定の IP アドレスからのアクセスに関しては、通常通りのレスポンスを返す。

準備

1. DOCUMENT_ROOT/maintenance.htmlを配置。画像等は使わず、1つの HTML ファイルで完結するようにする(と設定が楽)

2. /etc/httpd/conf.d/rewrite_maintenance.conf を配置。

# rewrite_maintenance.conf
ErrorDocument 503 /maintenance.html

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{DOCUMENT_ROOT}/maintenance.html -f
  RewriteCond %{REQUEST_URI} !=/maintenance.html
  RewriteCond %{REMOTE_ADDR} !=127.0.0.1
  RewriteCond %{REMOTE_ADDR} !=xxx.xxx.xxx.xxx
  RewriteRule ^.*$ - [R=503,L]
</IfModule>

xxx.xxx.xxx.xxx にはメンテナンスモードから除外したい IP アドレスを指定する。

3. SSL でアクセスする場合は、/etc/httpd/conf.d/ssl.conf も編集しておく。

# ssl.conf
<VirtualHost _default_:443>
    ## snip ##
    Include conf.d/rewrite_maintenance.conf
    ## snip ##
</VirtualHost>

4. maintenance.html を maintenance.html.rename_me 等にリネームしておく。

$ mv /var/www/html/maintenance.html /var/www/html/maintenance.html.rename_me

5. Apache httpd の reload

$ service httpd reload

メンテナンス時

maintenance.html のファイル名を切り替えるだけ。Apache httpd のリロードは不要。

メンテナンスモード ON
$ mv /var/www/html/maintenance.html.rename_me /var/www/html/maintenance.html
メンテナンスモード OFF
$ mv /var/www/html/maintenance.html /var/www/html/maintenance.html.rename_me

まとめ

ファイルのリネームだけでメンテナンスモードに入れるので、自動化も簡単ですね。