NGINXでロードバランシングの実験を1台のマシン(仮想マシンもOK)でする方法
2021/11/12
2021/11/24
タグ: LoadBalance, nginx, 仮想サーバ
NGINXにはReverseProxy機能の中にロードバランシング機能がある。これを使うと簡単に手軽な振り分けでスケールアウトができてしまう。昔はF5のBIG IPの製品を使うことが多かったが今となってはCPUスペックも上がってソフトウェアレベルで簡単にできるからいい時代になった。更にクラウドの仮想マシン、Kubernetes側でも簡単にロードバランシングができる。凝ったロードバランシングをしたかったらこのNGINXのReverseProxy機能のロードバランシングは使えると思います。
nginxの本体設定とロードバランスのリスナー側設定
Linuxのディストリビューションはどれでも良いと思います。次のような本体側のnginx.confとporxy用の設定、仮想サーバの設定を用意しましょう。今回は仮想サーバを1台のコンピュータ上に4台立ててロードバランシングを行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
user nginx; worker_processes 1; error_log /var/log/nginx-error.log notice; events { worker_connections 100; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] $status ' '"$request" $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx-access.log main; sendfile on; tcp_nopush on; keepalive_timeout 65; gzip on; include /etc/nginx/conf.d/*.conf; } |
以下の設定は/etc/nginx/conf.dの直下に配置する。proxy.confという名称で保存します。この設定は見てわかるようにロードバランスするReverseProxyの役割を行う。重み付けでweightの数を上げれば割当される頻度はあがる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
upstream backend { server w1.testserv.net:8080 weight=1; server w2.testserv.net:8081 weight=2; server w3.testserv.net:8082 weight=1; } server { listen 80; server_name www.testserv.net; location / { proxy_pass http://backend; } } |
仮想サーバ3台(ロードバランスワーカー)設定
3つの仮想ドメインでサーバを起動する。1台のコンピュータ&1枚のNIC上で処理を行うためホスト名変更と各々ポート番号をずらす設定が必要となる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
server { listen 8080; server_name w1.testserv.net; root /var/www/html; access_log /var/log/nginx/lb1-access.log; error_log /var/log/nginx/lb1-error.log; charset utf-8; location / { index index.html index.htm; } } server { listen 8081; server_name w2.testserv.net; root /var/www/html; access_log /var/log/nginx/lb2-access.log; error_log /var/log/nginx/lb2-error.log; charset utf-8; location / { index index.html index.htm; } } server { listen 8082; server_name w3.testserv.net; root /var/www/html; access_log /var/log/nginx/lb3-access.log; error_log /var/log/nginx/lb3-error.log; charset utf-8; location / { index index.html index.htm; } } |
サーバコンピュータ内のサーバ名を騙すため/etc/hosts内に架空のサーバ名を定義
1 2 3 4 5 6 |
$ vi /etc/hosts 192.168.10.177 www.testserv.net 192.168.10.177 w1.testserv.net 192.168.10.177 w2.testserv.net 192.168.10.177 w3.testserv.net |
NGINXの起動
<
1 2 3 |
$ sudo setenforce 0 $ sudo systemctl start nginx $ sudo systemctl stop firewalld |
アクセスしてログを確認
1 2 3 4 5 6 7 8 9 10 |
ターミナル側で3つ画面を開いて待っていましょう。 $ tail -f /var/log/nginx/lb1-access.log $ tail -f /var/log/nginx/lb2-access.log $ tail -f /var/log/nginx/lb3-access.log もうひとつのターミナル窓を開いたら。以下のコマンドを数十回叩いてみましょう。 仮想サーバごとのログにアクセス状況が交互に流れたら成功です。 もちろんcurlコマンドでなくてブラウザーからやっていただいても問題なし。 $ curl http://www.testserv.net |