#環境
cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
nginx -v
nginx version: nginx/1.12.0
DocumentRoot
~~
location / {
root /var/www/html;
index index.php index.html;
}
~~
#やりたいこと
特定のIP以外はメンテナンスの画面表示にする
#1.メンテナンス画面の用意
まずはメンテナンス用の画面を用意する(今回は簡単なものにする)
maintenance now!
#2./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化したで設定したファイルを例にとると以下のように設定すればよい。
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