Nginxでメンテナンスモード
Nginxでサイトをメンテナンスモードに切り替える設定をする。
仕様
既にサービスINしているシステムで、メンテナンスをする度に設定ファイルを編集・nginxを再起動するのは非常にめんどくさい。
というか、怖い。
今回はnginxのconfファイルをさわらず(nginxを再起動することなく)メンテナンスモードの切り替えができるようにします。
メンテモード⇔通常モードの切り替えはファイルの有無で判断します。
メンテナンス時に表示するメンテナンス画面用のHTMLはドキュメントルートに配置し、これもさわったりしないようにします。
こうすると通常モード時も”[url]/maintenance.html”とアクセスすると通常と同じようにメンテ中画面が表示されちゃうので、メンテモード時のみこの画面が開けるように設定します。
confファイル設定
特定のファイルがあるときはメンテモードと判断し、503応答、メンテページを表示させます。
また、管理用に指定したIPからのアクセスの場合は503を通過し、通常モードと同じようにアクセスできるようにします。
.conf
# 通過するIPを設定
geo $allow_ip_flag {
default 0;
192.168.1.0/24 1;
}
server {
error_page 503 /maintenance.html;
# `maintenance.txt`ファイルがあればメンテナンスモード中とみなす
set $maintenance false;
if (-f "/var/www/hoge/maintenance.txt") {
set $maintenance true;
}
# 特定のIPアドレスなら通過
if ($allow_ip_flag) {
set $maintenance false;
}
location / {
if ($maintenance = true) {
return 503;
}
}
location ~ \.php$ {
if ($maintenance = true) {
return 503;
}
}
location /maintenance.html {
if ($maintenance = false) {
return 404;
}
}
}
大体こんな感じ。※メンテモードにかかわる部分以外は省略しています。
要は、$maintenance
という変数を用意し、これがtrue
の場合は503を返すようにします。
この変数はif(-f "/var/www/hoge/maintenance.txt")
の部分で、指定ファイルがあればtrue
に設定します。
但し、あらかじめ指定しておいたIPアドレスからのアクセスの場合はfalse
に戻し、通過できるようにしています。
切替方法
今回の例では/var/www/hoge/maintenance.txt
ファイルの有無で判断しているので、
メンテモードにする場合
touch /var/tmp/hoge/maintenance.txt
メンテモードを解除する場合
rm /var/tmp/hoge/maintenance.txt
と、コマンド一発です。