Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

以前書いた記事で、「nginxでメンテナンスページを表示させる。」というのがあるのですが、もっと良いやり方があったので改めて書きます。

設定

とりあえず設定内容です。今回もmaintenanceというファイルをincludeしている前提で進めます。

maintenance
error_page 500 @maintenance;

# Set Env
set $maintenance "on";

# Allow Paths
if ($uri ~ "^/exclude/") {
  set $maintenance "off";
}

# Allow IPs
if ($remote_addr ~ "xxx.xxx.xxx.xxx") {
  set $maintenance "off";
}
if ($http_x_forwarded_for ~ "xxx.xxx.xxx.xxx") {
  set $maintenance "off";
}

# maintenance
if ($maintenance = "on") {
  return 500;
}
location @maintenance {
  rewrite ^(.*)$ /maintenance.html break;
}
nginx.conf(追記)
# include /etc/nginx/conf.d/maintenance;
rewrite ^/maintenance.html(.*)$ https://$host/ permanent

説明

まず初めの1行目のerror_page 500 @maintenance;というところでリターンコード500の場合@maintenanceというところへリライトするように設定しています。
このリライト先というのが一番下のlocationブロックです。
次にset $maintenance "on";で変数$maintenanceonという値をセットしておきます。
以下の部分ではif文を利用し、Allow Pathsの部分では特定パスへのアクセスに対して$maintenanceoffに、Allow IPsの部分では特定IPからのアクセスに対し$maintenanceoffを設定し直すように記載されています。
そして最後のところで$maintenanceonならリターンコードとして500を返すようにしています。
そうすることでメンテナンスを有効にしてもメンテナンスページへリダイレクトされるのではなくメンテナンスページのリライトで済みます。解除すると先ほどアクセスしていたパスが表示されます。

また、nginx.confの方ではinclude /etc/nginx/conf.d/maintenance;をコメントアウト(#)付きで記載しておき、#の付け外しで制御するようにしています。
また、その下のrewriteルールでmaintenance.htmlへのアクセスは無条件にサイトのトップへリダイレクトさせることで何か間違ってメンテナンスページへ直接アクセスしてしまった相手に対しての対処もしています。

おわりに

リダイレクトとリライトをうまく駆使することがポイントだなと感じました。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした