4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

nginxでメンテナンスページを表示させる。

Posted at

はじめに

nginxでメンテナンスページを表示させるための基本設定をまとめました。

設定

ここでは管理しやすいようにメンテナンスページ用の設定はmaintenanceという名前で別に記載し、includeさせます。

maintenance
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です。

おわりに

この手の設定のポイントはホワイトリスト方式にすることだと思います。
まず、全てのアクセスがメンテページに行くように設定した上で、特定の条件のみ除外とすることで漏れを防げます。

4
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?