インフラエンジニアも人間じゃない?

インフラエンジニアの備忘録

Nginxで色々な通信を適当にバランシングする

こんにちは。突然ですが数台あるオンプレサーバで、適当に負荷分散したい時は何を使いますか?
簡単にできるものだとWindows標準のNLB、適当でよければDNSラウンドロビン等ですかね。

クラウドであればAWSならELBとかに少し設定するだけで終わりですが。オンプレだとなかなか面倒です。
ここでおすすめなのがNgxinによるL7ロードバランスです。
※L4でもできるらしいですが、僕はL4分散に親を殺されたためこれ以上触れません。

NginxならWebサーバやリバースプロキシで使うことがほとんどだと思いますが、こいつは標準でロードバランサとしても利用できます。
httpdでも同じようなことができますが、mod入れたりなど少し面倒なので…

まずはNginxを入れます。
nginx.org

Centos7では標準リポジトリにないので設定を追加します。

sudo vi /etc/yum.repos.d/nginx.repo

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

インストールします。

sudo yum install nginx

ロードバランサの設定を入れます。

sudo vi /etc/nginx/conf.d/balancer.conf

基本は以下のようなイメージで設定します。

upstream backends {
    server 192.168.0.1:8080;
    server 192.168.0.2:8080;
    server 192.168.0.3:8080;
}

server {
    listen 8080;
    proxy_pass backends;
}

ちゃんとしたコンフィグや細かいオプションは公式を見ましょう。
nginx.org

ちなみに、デフォルト設定だとラウンドロビンで分散されるため、パーシステンスに分散するにはip_hashとかで分散するか、
httpであればcookieなどで分散先を分けるのがいいでしょう。

upstream backends {
    ip_hash;
    server 192.168.0.1:8080;
    server 192.168.0.2:8080;
    server 192.168.0.3:8080;
}

server {
    listen 8080;
    proxy_pass backends;
}


ip_hash分散であればHTTP以外の通信も色々バランシングできるので、ようわからんプロトコルでもとりあえずなんとかなると思います。
こうするとTCPUDPを両方分散することもできます。

upstream backends {
    ip_hash;
    server 192.168.0.1:8080;
    server 192.168.0.2:8080;
    server 192.168.0.3:8080;
}

server {
    listen 8080;
    proxy_pass backends;
}

server {
    listen 8080 udp;
    proxy_pass backends;
}


高機能とかを求めてる人はそもそもアプライアンスを買いましょう。