動かざることバグの如し

近づきたいよ 君の理想に

NginxでIPアドレスを条件分岐にしてアクセス先を変更する方法

やりたいこと

メンテナンスページで内部IPからのみとかで分岐したい

環境

  • nginx

nginxがgeoモジュールに対応しているビルドである必要がある

nginx -V |grep with-http_geoip_module

でなにか表示されれば対応済み なければ無理 ただapt経由でインストールしても対応していたので、デフォルトで有効だと思われる

設定

例えば以下の2つのアクセス先があったとして、通常は192.168.1.100へ飛ばしたいけど、特定のIPアドレス(仮に8.8.8.8とする)からのアクセスは192.168.1.200にしたいとする。

まず2つのサーバーを定義

upstream normal_server {
  server 192.168.1.100;
}

upstream test_server {
  server 192.168.1.200;
}

次に条件分岐したいIPアドレスの条件を書く。

geo $allow_ip {
  default 0;
  # 許可したいIPアドレスの帯域
  8.8.8.8/32 1;
}

で、最後にそれに基づく条件式を書く

server {
  if ($allow_ip = 0) {
    set $target_proxy_server "normal_server";
  }

  if ($allow_ip = 1) {
    set $target_proxy_server "test_server";
  }

  location / {
    proxy_pass http://$target_proxy_server;
  }
}

参考リンク