あすたぴのブログ

astap(あすたぴ)のブログ

Nginxを使用してロードバランシング

dockerを使って、複数サーバーアクセスした際の検証を行いたかったので ロードバランサーについて調べたことのメモ。 ELBしか使ったことなかったから全く知らなかったです。

http://nginx.org/en/docs/http/load_balancing.html

nginxではロードバランサーとして以下の機能があります。

最小構成の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は、ヘルスチェックに失敗したサーバーをバランシングの対象から外している時間です。