概要
Nginxでメンテナンス画面を表示させてかつ、
特定のポートからは普通に画面表示させる方法を調べました。
Nginxでメンテナンス画面を表示させる方法は
「Nginxでお手軽にメンテナンス画面を表示する方法」を参考にしました。
やりたいこと
- /var/tmpにmaintというファイルがあればメンテナンス中とする
- メンテナンス中はポート443でアクセスされると強制的にmaintenance.htmlを表示
- メンテナンス中でなければポート1443でアクセスされると強制的にno_maintenance.htmlを表示
confファイルの設定内容
xxx.conf
server {
listen 443;
listen 1443;
・・・
root /var/www/xxx/public;
set $maint "";
set $maint_page "/maintenance.html";
# maintファイルがあればメンテ中
if (-e /var/tmp/maint) {
set $maint MAINT;
}
set $maint "${maint}${server_port}";
# 無限ループを防止
if ($uri ~ "/maintenance.html") {
set $maint "";
}
if ($uri ~ "/no_maintenance.html") {
set $maint "";
}
if ($uri ~ "/maintenance.jpg") {
set $maint "";
}
# メンテ中で443アクセスの場合は503を返却
if ($maint = MAINT443) {
return 503;
}
# メンテ中ではなく1443アクセスの場合は503を返却
if ($maint = 1443) {
set $maint_page "/no_maintenance.html";
return 503;
}
error_page 503 "${maint_page}";
・・・
}
ifが並んで見づらいですが、Nginxはifを入れ子にできず論理演算子も書けないのでこういう書き方になっています。