My Note

自己理解のためのブログ

Nginxでgeoモジュールを使ってメンテナンス中にIP制限をかける

やりたいこと

メンテナンスモード時に一部のアクセスは許可(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>

関連