LoginSignup
22
19

More than 5 years have passed since last update.

nginxでのメンテナンス画面表示

Last updated at Posted at 2017-07-03

環境

cat /etc/redhat-release 
CentOS Linux release 7.3.1611 (Core) 
nginx -v
nginx version: nginx/1.12.0

DocumentRoot

/etc/nginx/conf.d/default.conf
~~

    location / {
        root   /var/www/html; 
        index  index.php index.html;
    }

~~

やりたいこと

特定のIP以外はメンテナンスの画面表示にする

1.メンテナンス画面の用意

まずはメンテナンス用の画面を用意する(今回は簡単なものにする)

/var/www/html/maintenance.html
maintenance now!

2./etc/nginx/conf.d/maintenance.confを用意する

ここの書き方がよくわからずに結構つまずいた。

/etc/nginx/conf.d/maintenance.conf
server {
    server_name  example.com; 
    error_page 503 /maintenance.html; 
    location / {
    root /var/www/html; 
   if ($remote_addr != "画面表示したい特定IP(外部IP)") {
      return 503;
    }
   }
   location = /maintenance.html {
       root /var/www/html;
   }
}

3.nginxのリスタート

systemctl restart nginx

これで特定IP以外はメンテナンスの画面を表示させることができた。


2017/07/08追記
letsencryptでvpsをssl化したのでsslした時にもnginxをメンテナンスできるか設定をして見た

4.httpsでのメンテナンス画面表示

最初に設定を入れる時は何も考えずに2. で用いたものが使えると思ったが間違い。

まず、https通信の時はhttp → httpsにリダイレクトさせているから。

httpのとき
http → 503 → /maintenance.html

設定ファイル
dev-example.conf :バーチャルホストの設定
maintenance.conf :メンテナンス表示の設定
httpsのとき
http → https → 503 → /maintenance.htlm

設定ファイル
dev-example.conf :バーチャルホストの設定
maintenance.conf :メンテナンス表示の設定→これだとうまくいかなかったのでdev-example.confに記載する

httpsではリダイレクトしたあとにメンテナンス画面を表示するようにさせる必要があるためsslの設定confにメンテナンスの記載をする。

letsencryptでvpsをssl化したで設定したファイルを例にとると以下のように設定すればよい。

dev-example.conf
geo $access_from {
    default        external;
    <画面表示したい特定IP(外部IP)> internal;
    <画面表示したい特定IP(外部IP)> internal;
  }

server {
    listen       80;
    server_name  <domain>;
    return 301 https://$host$request_uri; #リダイレクト設定
    }

server {
        listen 443 ssl;
    server_name  <domain>;

    ssl on;

        ssl_certificate       /etc/letsencrypt/live/<domain>/fullchain.pem;
        ssl_certificate_key   /etc/letsencrypt/live/<domain>/privkey.pem;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

~

    error_page 503 @maintenance;

    set $maintenance false;

    if (-e /var/www/html/maintenance.html) {#メンテナンスのhtmlが存在すれば
      set $maintenance true;
    }
    if ($access_from !~ external) {
      set $maintenance false;
    }
    if ($maintenance = true) {
      return 503;
    }

    location @maintenance {
      root /var/www/html;
      rewrite ^(.*)$ /maintenance.html break;
    }

}

/var/www/html/maintenance.htmlが存在する場合のみ発動させることが可能

mv /var/www/html/maintenance.html /var/www/html/maintenance.html_
mv /var/www/html/maintenance.html_ /var/www/html/maintenance.html

ngixの再起動を忘れない

systemctl restart nginx

参考
Nginxでメンテナンスページに編集なしで即時切り替える方法
if文の判定記号

22
19
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
22
19