Nginxをロードバランサとして使う

ロードバランサ(負荷分散装置)

  • クライアントPCからWebサーバなどへのアクセス要求を制御して同じような能力を持つ複数のサーバに、アクセスを分散
  • サーバからの応答速度の遅延を防ぎシステムダウンを回避
  • 同じクライアントPCからの通信を常に同じサーバに転送できる
  • 利用者から見えるのは、常に1台の”仮想的なサーバ。複数のサーバを、あたも1台の高性能サーバのように使える
  • アベイラビリティ( 可用性 システムの止まりにくさ )
    • サーバの故障を隠蔽して、Webサイトのサービスを継続させることができる

Nginxでの作成方法

  • upstreamディレクティブを使う
    • upstream: サーバのグループを定義。
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
#LoadBarancerConfiguration;
worker_processes 1;

events {
worker_connections 1024;
}


http {
include mime.types;
default_type application/octet-stream;

sendfile off;

#下記のserverのアクセスを以下の3つのserverに振り分ける
upstream backend {
server 127.0.0.1:8001;
server 127.0.0.1:8002;
server 127.0.0.1:8003;
}

#localhost:8080にアクセスすると「backend」のアドレスにそれぞれ振り分けられる
server {
listen 8080;
server_name localhost;
location / {
#上記で設定した「backend」を表示
proxy_pass http://backend;
}
}
}

Nginxのロードバランサの種類

  1. ラウンドロビン round robin

    • リソース(資源)を順繰りに割り振ってゆく方式
    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      upstream backend {
      server backend1.example.com weight=5;
      server backend2.example.com;
      server 192.0.0.1 backup;
      }
      server {
      location / {
      proxy_pass http://backend;
      }
      }
  2. リーストコネクション Least Connected

    • アクティブな接続数がもっとも少ないサーバーに割り当てられる
    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      http {
      upstream backend {
      least_conn;
      server srv1.example.com;
      server srv2.example.com;
      server srv3.example.com;
      }
      server {
      location / {
      proxy_pass http://backend;
      }
      }
  3. IPハッシュ

    • クライアントのIPアドレスに基づくハッシュ関数が使われどのサーバーか選択される
    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      http {
      upstream backend {
      ip_hash;
      server srv1.example.com;
      server srv2.example.com;
      server srv3.example.com;
      }
      server {
      location / {
      proxy_pass http://backend;
      }
      }
  • Nginxではデフォルトでラウンドロビン

  • サーバごとの負荷に重みをつける。下記の場合 srv1:srv2:srv3 = 3:1:1 になる

    • 1
      2
      3
      4
      5
      6
      7
      8
      http {
      upstream hoge.com {
      ip_hash;
      server srv1.example.com weight=3;
      server srv2.example.com;
      server srv3.example.com;
      }
      }

http://mogile.web.fc2.com/nginx/admin-guide/load-balancer.html
https://www.weblio.jp/content/ラウンドロビン
https://www.nedia.ne.jp/blog/tech/2016/08/04/7938
http://www.infraexpert.com/study/loadbalancer1.html
http://www.fujitsu.com/jp/products/network/security-bandwidth-control-load-balancer/ipcom/material/data/1/1.html