Nginx ロードバランサをVPN通信との切り替えのためだけに使う
by haturatu
3 min read
こんにちは、無能です。
 生野菜の旨さに気づいて深夜に生ナスとキュウリを味噌につけてそれぞれ3個くらい食べちゃいました・・・。
 日本に生まれて良かった・・・。
本来的ではないのですが、私の場合複数VPNを切り替えたりしているためその場合自宅サーバのローカル環境下の内部IP192.168.x.x、ただしVPNを切り替えると10.1.x.xとなります。
 イメージとしてはこうです。
192.168.x.x- ノートPC -> 自宅サーバのHTTPサーバにアクセス
 
10.1.x.x- ノートPC -> WireGuard VPN 
0.0.0.0/0を通るようにするインターフェイスを使う -> 自宅サーバのHTTPサーバにアクセス 
- ノートPC -> WireGuard VPN 
 
いくつかwg*の設定があると10.1.x.xだけを通るVPNもあるのでその場合は192.168.x.xでも通るし、なんか結構ややこしくなっているんですよね・・・
激しく切り替えていると結構面倒で複数IPv4での検証を行うときにも切り替えるので動的にこれを切り替えられないかなあ?と思ったらNginxのロードバランサがあるではないか、とおもってそれでリバースプロキシしてしまえば実質的に生きているupstream先にプロキシできるやん!と思いつきました。
Nginx
ローカルなのでタイムアウト等は極端に短くしています。
 つまりは、このLBのおかげで生きているupstream先に切り替わるのであとはlocalhostでアクセスするだけなんですよね。
 192.168.x.xを優先的にしているのはローカルネットワークだけであるほうがエコだからそうしているだけです。
upstream home {
    server 192.168.1.227:8888 weight=10 max_fails=2 fail_timeout=1s;
    server 10.1.0.20:8888 weight=1 max_fails=2 fail_timeout=1s;
    keepalive 16;
}
server {
    listen 80;
    server_name localhost;
    location / {
        proxy_pass http://home/;
        proxy_connect_timeout 1s;
        proxy_read_timeout 1s;
        proxy_next_upstream_tries 1;
    }
}
bashrc
そこでお気づきの方もいるかもしれませんがこの場合、バックエンド先ポートが動的に変更できません。Nginxの場合はupstreamディレクティブは変数使えないので固定するしかないんですよね。
 なんかシンプルにやる方法ないかなあと思ったのですが諦めて.bashrcでプロキシ先変更できる関数作りました。
 まあsudoをいれるのがナンセンスだといわれれば、そうです。
nproxy() {
  if [ -z "$1" ]; then
    echo "Usage: nproxy <port>"
    return 1
  fi
  local PORT=$1
  local NGINX_CONF="/etc/nginx/site/proxy.conf"
  local NOW_PORT=$(grep -oP ':[0-9]+' $NGINX_CONF | uniq)
  local INIT_SERVICE="rc-service"
  sudo sed -i "s/$NOW_PORT/:$PORT/g" $NGINX_CONF
  sudo $INIT_SERVICE nginx restart
  echo "nginx restarted. $NOW_PORT -> :$PORT"
}
こんな感じに切り替わります。
thepassenger:[haturatu]:~$ nproxy 8888
nginx            | * Checking nginx' configuration ...                                                                       [ ok ]
nginx            | * Stopping nginx ...                                                                                      [ ok ]
nginx            | * Starting nginx ...                                                                                      [ ok ]
nginx restarted. :88888 -> :8888
thepassenger:[haturatu]:~$ nproxy 88
nginx            | * Checking nginx' configuration ...                                                                       [ ok ]
nginx            | * Stopping nginx ...                                                                                      [ ok ]
nginx            | * Starting nginx ...                                                                                      [ ok ]
nginx restarted. :8888 -> :88
thepassenger:[haturatu]:~$ nproxy 8844
nginx            | * Checking nginx' configuration ...                                                                       [ ok ]
nginx            | * Stopping nginx ...                                                                                      [ ok ]
nginx            | * Starting nginx ...                                                                                      [ ok ]
nginx restarted. :88 -> :8844
thepassenger:[haturatu]:~$ 
これでlocalhost:80からすぐにバックエンド先のアプリケーションにすぐ切り替えれるようになりました。
それではまた。
 よろしくお願いします。