Nginxではifを用いて特定のファイルが存在するか調べることができるのでこれを利用する
以下のような設定にすることで/var/tmp/do_maintenanceがある場合はメンテナンス、ない場合は通常の状態を表示できる。
# setディレクティブでメンテナンスon/off用フラグ変数を設定
set $maintenance false;
# /var/tmp/do_maintenanceがある場合はメンテモード
if (-e /var/tmp/do_maintenance ) {
set $maintenance true;
}
# メンテ時でもサイトを確認するためのワークアラウンド
# 特定のアドレスからの場合は通常の状態の表示を許可
if ($remote_addr = XXX.XXX.XXX.XXX) {
set $maintenance false;
}
# メンテナンスモードの場合は/maintenance.htmlにrewirteしつつ、rootディレクトリを書き換える
# この場合だと/var/www/maintenance/maintenance.htmlがメンテナンス画面用ファイルになる
# このような周りくどい設定にしているのは通常時にmaintenance.htmlを直アクセスで見れないようにするため。
if ($maintenance = true) {
rewrite ^ /maintenance.html redirect;
}
# メンテナンスファイルの置き場を指定
location /maintenance.html {
root /var/www/maintenance;
# キャッシュさせないようにexpiresを0にしておく
expires 0;
}
# 通常時のrootディレクトリ
location /
root /var/www/root;
}