しょっちゅう必要になるので、メモ書き程度に
参考にしたのは、以下の URL です。
- Apache
- Nginx
前提としてメンテナンス中画面として表示する際に使用する html は以下のファイルを使うものとします。
- maintenance.html
- style.css
- /img/corp_logo.png
また、以下の IP アドレスからのアクセスは管理者からなのでメンテナンス中画面を表示しないものとします。
- 192.168.0.4
- 192.168.0.5
Apache の場合
Webサイトのメンテナンス中画面を出す正しい作法と.htaccessの書き方に書いてあるままなんですが、以下の内容を .htacceess に追記します。
ErrorDocument 503 /maintenance.html
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} !=/maintenance.html
RewriteCond %{REQUEST_URI} !=/style.css
RewriteCond %{REQUEST_URI} !=/img/corp_logo.png
RewriteCond %{REMOTE_ADDR} !=192.168.0.4
RewriteCond %{REMOTE_ADDR} !=192.168.0.5
RewriteRule ^.*$ - [R=503,L]
</IfModule>
参照元と違う所は、メンテナンス画面には html だけではなくて css や png も使用しているため、それらのファイルへのアクセスについては 503 を返さないようにしています。
Nginx の場合
Nginx では .htaceess のように動的に設定を変更することはできません。
なので Nginxでrestart, reloadをすることなくメンテナンス画面に切り替えるに書いてある手法を使って /var/tmp/do_maintenance というファイルがあった場合はメンテナンス画面を表示するようにします。
メンテナンスを開始するときは touch /var/tmp/do_maintenance でファイルをつくってやって、終わったら rm /var/tmp/do_maintenance でファイルを消してあげましょう。
具体的には nginx.conf に以下のような設定を追加します。
set $maintenance false;
if (-e /var/tmp/do_maintenance ) {
set $maintenance true;
}
if ($request_uri ~ ^/(maintenance\.html|style\.css|img/corp_logo\.png)) {
set $maintenance false;
}
if ($remote_addr ~ ^(192.168.0.4|192.168.0.5)) {
set $maintenance false;
}
if ($maintenance = true) {
return 503;
}
error_page 503 @maintenance;
location @maintenance {
rewrite ^(.*)$ /maintenance.html break;
}
Apache でも Nginx でも、どちらともメンテナンス時は 503 を返して、カスタムエラーページの機能を使って maintenance.html を表示する感じですね。