tkuchikiの日記

新ブログ https://blog.tkuchiki.net

nginx の HttpGeoModule を使って、特定 ip からのアクセス以外は 503 を返すのを簡潔に書く

特定の ip からのアクセス以外は 503 を返す例です。
nginxで特定ホスト以外からのアクセスをメンテナンス画面にする方法 (2) - (ひ)メモ を参考にさせていただきました。
ありがとうございます。

以下が設定です。

geo $geo {
    default   1;
    127.0.0.1 0;
}

server {
    listen       80 default_server;
    server_name  _;

    location / {
        set $maintenance $geo;

        if ($maintenance) {
            return 503 "Service Unavailable";
        }
        return 200 "OK";
    }
}

この状態で、127.0.0.1 以外から http request を送ると、
Service Unavailable を返します。

巷でよく見かける、ファイルがあるときだけ 503 にしたい場合は、

set $maintenance $geo;

if ( -f /path/to/file ) {
    set $maintenance $geo;
}

とすれば ok です。
許可する ip を増やしたい場合は、

geo $geo {
    default   1;
    127.0.0.1 0;
    192.168.0.0/16 0;
    ... 0;
}

のように書けば良いです。
geo $VAR {} の説明をしておくと、

geo $VAR {
    REMOTE_ADDR VALUE;
    ...
}

という意味になっています。
REMOTE_ADDR に match した ip からアクセスがあると、$VAR には対応した VALUE が入ります。
したがって、

geo $geo {
    192.168.0.0/16 100;
}

と設定している状態で、
192.168.0.1 から http request を送ったとすると、
$geo == 100 となります。