はじめに
nginxでメンテナンスページを表示させるための基本設定をまとめました。
設定
ここでは管理しやすいようにメンテナンスページ用の設定はmaintenanceという名前で別に記載し、includeさせます。
set $maintenance "true";
if ($uri ~ "^/maintenance.html") {
set $maintenance "false";
}
if ($uri ~ "^/exclude/") {
set $maintenance "false";
}
if ($remote_addr ~ "xxx.xxx.xxx.xxx") {
set $maintenance "false";
}
if ($maintenance = "true") {
rewrite ^(.*)$ http://www.hoge.jp/maintenance.html? redirect;
}
説明
まず、maintenance の一番下に記載されているif文ですが、「$maintenance = "true"」ここでmaintenance変数がtrueである場合 http://www.hoge.jp/maintenance.html
へリダイレクトが行われるという設定です。
次に一番上の「set $maintenance "true";」ではmaintenanceという変数にtrueという値を設定しています。
ですので、この設定だけだとアクセスが来たら全てリダイレクトされるように設定になっています。
それだとメンテナンスページにリダイレクトされても、またリダイレクトされてしまうため無限ループになってしまいます。
そこで一つ目のif文で、maintenance.html
へのアクセスの場合はmaintenance変数にfalseを設定し直します。
これで全てのアクセスが用意した http://www.hoge.jp/maintenance.html
へリダイレクトされます。
次に特定のパスへのアクセスに対してはメンテナンスページを表示させない設定です。
二つ目のif文でその設定をしています。
今回は/exclude/
以下に対してのアクセスはリダイレクトを行わない設定です。
もし、除外パスが/EXCLUDE/
もであれば~
の部分を~*
に変更することで大文字小文字の区別をなくすことができます。
最後に特定IPからのアクセスはメンテナンスページを表示させない設定です。
三つ目のif文でその設定を行っています。
ここでは直接サーバーへのアクセスの場合ですがLoadBalancerなどを経由する場合、$remote_addr
だと設定によってはLBのIPが記載されてしまう場合があるので、その場合は$http_x_forwarded_for
へ変更する必要があります。
confに、real_ip_header X-Forwarded-For;
といった設定が入っていればおそらく$remote_addr
で大丈夫です。
デフォルトのnginxの場合はこのmaintenanceファイルを/etc/nginx/conf.d/maintenance
などに配置し、nginx.confのserverディレクティブ内にinclude /etc/nginx/conf.d/maintenance;
と追記してリロードすればOKです。
おわりに
この手の設定のポイントはホワイトリスト方式にすることだと思います。
まず、全てのアクセスがメンテページに行くように設定した上で、特定の条件のみ除外とすることで漏れを防げます。