こんにちは、鯨井貴博@opensourcetechです。
今回は、Nginx1.7.10を使用してロードバランシングを行ってみようと思います。
なお、バックエンドには、Apacheを3台使用して構成しています。
構成説明
Client-------Nginx(192.168.11.150)------Apache(192.168.11.151)
Apache(192.168.11.152)
Apache(192.168.11.153)
まず、バックエンドのApacheを構築します。
OSとしては、virtualbox上にCentOS6.6_x64を使用しています。
yum install httpd
rpm -q httpd(インストール確認)
続いて、apacheの設定をします。
vi /etc/httpd/conf/httpd.conf
今回は、apacheをVirtualhostとして設定して3台に見せかけています。
また、各Virtualhostのindex.htmlとして、
以下のような簡単な内容を作成しました。
/etc/init.d/httpd startでapacheを起動。
iptablesを編集し、TCP80の通信を許可しておきます。
iptables -I INPUT 5 -p tcp --dport 80 -j ACCEPT
iptables -L --line-numbers
また、SELinuxについても有効化されている場合、
無効化などの対応をしておきます。
setenforce 0
getenforce
ちなみに各Virtualhostへクライアントからアクセスした場合、
以下のように背景色が異なるコンテンツにアクセスします。
続いて、Nginxを構築します。
まず、Nginx mainline用のレポジトリファイルを追加して、
yum install nginx
rpm -q nginxと/usr/sbin/nginx -Vにて、
インストール後の確認をしておきます。
Nginxの設定を/etc/nginxディレクトリ内のnginx.confに行います。
vi /etc/nginx/nginx.conf
編集内容としては、
以下のようにupstreamブロックにバランシング対象のサーバを設定します。
※デフォルトでは、ラウンド・ロビンで負荷分散します。
/etc/init.d/nginx startでNginxの起動、
netstat -tan | grep 80で起動確認をします。
また、Apache同様にiptablesにてTCP80の通信を許可しておきます。
iptables -I INPUT 5 -p tcp --dport 80 -j ACCEPT
iptables -L --line-numbers
ロードバランシングの動作確認については、
xamppなどに含まれているApache Bench(abコマンド)を使用します。
https://www.apachefriends.org/jp/index.html
WindowsのDoS promptから
ab.exe -n 100 http://192.168.11.150とします。
※Path(パス)にご注意下さい。
tcpdump等で取得したパケットキャプチャを見ると、
確かに負荷分散(デフォルトのラウンド・ロビン)しています。
また、weight=2などとすることで重み付けも可能です。
パケットキャプチャを見ると、
きちんと重み付けがされていますね。
ラウンド・ロビン(round-robin)の他にも、
クライアントIPによってサーバを固定するip_hashや、
最少コネクションのサーバを使用するleast_connもあります。
また、
max_fails=3 fail_timeout=10sとすることで、
10秒間に3回の通信失敗があった場合、
そのサーバが動作していないとNginxに判断させることがも出来ます。
backupを設定し、他のサーバが動作しなくなるなった場合のみ負荷分散対象とすることも出来ます。
通常サーバが動作している状態のパケットキャプチャ
backupのみ動作している状態のパケットキャプチャ