裏紙に書く程度の内容

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

と、コマンド一発です。

参考

nginxでサービスモードとメンテナンスモードを切り替える - Qiita

Index