Nginx メンテナンス画面作成

nginx

投稿日 2015年11月12日


Nginxを利用しているサービスをメンテナンスする際に、Nginxの設定を変更したり再起動せずにメンテナンス画面に切り替えるようにする
Nginxではif文を使うことができるので特定のファイルの有無を判定してメンテナンス中かどうかを判定する
メンテナンスモードの場合はHTTPステータスコードを503で返し、指定されたファイルを表示する
リダイレクトする形式と違い、そのままのURLで利用できる

前提

  • メンテナンス用ファイルは /var/www/maintenance に置く
  • 特権権限で/var/tmp/do_maintenanceファイルを作成できる

メンテナンス用フォルダ構成

/var/www/maintenance/
|-- css
|   `-- style.css
|-- image
|   |-- footer_logo.png
|   `-- header_logo.png
`-- maintenance.html

nginxの設定ファイル

# メンテナンス判定用のフラグを定義
set $maintenance false;

#/var/tmp/domaintenanceファイルの有無を確認し、フラグの判定
if (-e /var/tmp/do_maintenance ) {
  set $maintenance true;
}

#メンテナンス中でもサイトを確認するため
#特定IPからは通常どおり表示させる
if ($remote_addr = xxx.xxx.xxx.xxx) {
  set $maintenance false;
}

#すべてのリクエストを503で返すと画像とCSSも表示できなくなるため画像とCSSは503で返さないようにする
#http://~~~/maintenance/css/***.css
#http://~~~/maintenance/images/***.png
#http://~~~/maintenance/images/***.jpeg
#http://~~~/image/favicon.ico
#上記のファイルは503にせず通す
if ($request_uri ~ ^/(maintenance/css/.*\.css|maintenance/image/.*\.(png|jpg)|images/favicon.ico)) {
  set $maintenance false;
}

#メンテナンス判定フラグがtrueの場合は503を返す
if ($maintenance = true) {
  return 503;
}

#画像とCSSのlocationを設定する
location  ~ ^/maintenance/css/ {
  root /var/www/;
}

location  ~ ^/maintenance/image/ {
  root /var/www/;
}

#上で返した503のページを設定する
#設定されていない場合は404になる為注意
error_page 503 @maintenance;
location @maintenance {
  root /var/www/maintenance;
  rewrite ^(.*)$ /maintenance.html break;
}

設定が完了したらnginxを再起動

# service nginx restart

再起動後はメンテナンス実施時に下記コマンドを利用するだけでメンテナンスモードにできるようになる

メンテナンスモード設定

$ sudo touch /var/tmp/do_maintenance

メンテナンスモード解除

$ sudo rm /var/tmp/do_maintenance

2016 GakuBlog