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
からすぐにバックエンド先のアプリケーションにすぐ切り替えれるようになりました。
それではまた。
よろしくお願いします。