Nginxを使用してロードバランシング
dockerを使って、複数サーバーアクセスした際の検証を行いたかったので ロードバランサーについて調べたことのメモ。 ELBしか使ったことなかったから全く知らなかったです。
http://nginx.org/en/docs/http/load_balancing.html
nginxではロードバランサーとして以下の機能があります。
- ラウンドロビン
- 最小接続(負荷分散)
- IPハッシュ
最小構成のconf記述
http {
upstream myapp1 {
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
server {
listen 80;
location / {
proxy_pass http://myapp1;
}
}
}
特に設定しない場合はデフォルトでラウンドロビン方式になります。
HTTP,HTTPS,FastCGI,uwsgi,SCGI,memcachedに対してロードバランサーを適用できます。
以下の例では、least_connの設定になり、 各サーバーの負荷が均一になるようにバランシングされます。
upstream myapp1 {
least_conn;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
ラウンドロビンと負荷分散では、 同じユーザーが常に同じサーバーにバランシングされるわけではないことに注意をしてください。
upstream myapp1 {
ip_hash;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
IPハッシュの方式では、サーバーが使用できない状態にならなければ、 同じサーバーに対してアクセスが行われます。
重み付け
今までの例では、すべてのサーバーに対して同等に重みが扱われています。 重み付のパラメーターを設定することでバランシングのアルゴリズムに影響を与えることが可能です。
upstream myapp1 {
server srv1.example.com weight=3;
server srv2.example.com;
server srv3.example.com;
}
5リクエスト合った場合に、上記の例ではsrv1に3リクエスト、srv2,3に1リクエストずつバランシングが行われます。
ヘルスチェック
ロードバランサーではヘルスチェックを行います。 特定のサーバーからレスポンスがない場合はしばらくの間、 バランシングの対象から外します。
max_failsディレクティブは連続失敗試行回数です。 fail_timeoutは、ヘルスチェックに失敗したサーバーをバランシングの対象から外している時間です。