やりたいこと
- メンテナンスモード時に一部のアクセスは許可(200)し、それ以外はメンテナンス(503)を返すようにしたい
実現方法
- Nginxのgeoモジュールを利用する
設定(geoモジュールを使う)
-
Nginxドキュメント(geo)
-
$ nginx -V
でモジュールが利用できるか確認する -
--with-http_geoip_module
が出力されればok! -
許可するIPを指定する(今回はVPC内は許可にした)
- デフォルトは0 ( False )
- マッチしたら1 ( True )
geo $allow_ip {
default 0;
10.0.0.0/16 1;
}
-
$allow_ip
が-
true
だったら(許可リストに有)、通常モードにする -
false
だったら、(許可リストに無)、メンテナンスモードする
-
if ($allow_ip) {
set $maintenance false;
}
- 検証で設定したconfファイルの全体
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name 10.0.1.113;
error_page 503 @maintenance;
recursive_error_pages on;
if (-e /var/www/html/maintenance.html) {
set $maintenance true;
}
if ($allow_ip) {
set $maintenance false;
}
if ($maintenance = true) {
return 503;
}
location / {
try_files $uri $uri/ =404;
}
location @maintenance {
expires 0;
internal;
if (-f $request_filename) {
break;
}
error_page 405 = /maintenance.html;
rewrite ^(.*)$ /maintenance.html break;
}
}
実行結果(vpc内から接続)
<!DOCTYPE html>
<html>
<title>Welcome to nginx!</title>
<p><em>Thank you for using nginx.</em></p>
</html>
実行結果(vpc外から接続)
<html>
<p> This is Maintenance Page </p>
</html>
関連
- Nginxでメンテナンスページの設定をする
- Nginxで静的ページにPostすると405で取得できない場合の対処