Nedia What's up!

ネディアのエンジニアによるIT技術やサービスの紹介・検証などをお届け!

Nginxのロードバランシング機能を使ってみよう!


Nginxとは

Nginxは、フリーかつオープンソースのWebサーバーです。
HTTP/HTTPS/SMTP/POP3/IMAPのリバースプロキシの機能に加え、ロードバランサー、HTTPキャッシュの機能を持っています。

Nginxが開発されたのは、Apache httpdのロードバランシング機能に対するパフォーマンス不足からということもあり、Nginxのロードバランシング機能はパフォーマンスが高く、またさまざまな付加機能を持ち合わせています。

Nginxをロードバランサーとして活用する

Nginxの開発元が目標としたのは、高速なWebアクセラレーションです。
Webアクセラレーターは本来のWebサーバーの代わりにクライアントからのリクエストを受け付け、サーバーからのレスポンスをキャッシュ、または複数のサーバーに分散させることでレスポンスを高速化します。
この際に重要になるのが、リバースプロキシ/ロードバランシング機能ですが、今回はNginxのロードバランシング機能について2回に渡り紹介します。

nginx01

補足 リバースプロキシについて
通常のプロキシはクライアントとインターネットの間に設置され、特定のクライアントから不特定多数のサーバーへのリクエストを中継します。
それに対しリバースプロキシは 逆プロキシと呼ばれ、インターネットとWebサーバーの間に設置され、不特定多数のクライアントから特定のサーバーへのリクエストを中継します。

Nginxのロードバランシグの種類

Nginxでは以下のロードバランシングメカニズム(あるいはメソッド)がサポートされています。

①ラウンドロビン
アプリケーションへのリクエストはラウンドロビンの形式で分配されます
②Least Connected
次のリクエストはアクティブな接続数がもっとも少ないサーバーに割り当てられます
③IPハッシュ
次のリクエストにどのサーバーが選択されるべきかを決めるためにハッシュ関数が使われます(クライアントのIPアドレスに基づく)

Nginxのインストールについて

CentOS6の環境にNginxをインストールする方法を紹介します。
Nginx は CentOS 標準のリポジトリからは提供されていません。そこで、Nginx から提供されているCentOS用のリポジトリファイルを追加します。

リポジトリファイルの作成

Nginx のリポジトリファイルの内容

yumを使ってインストールする

以上の作業で、Nginxのインストールは完了です。

Nnginxを起動する

Nginxの動作確認

インストールしたサーバのIPアドレスをブラウザのURLに打ち込んでアクセスしてみましょう。
下記のようなページが表示されていればインストール成功です。

nginx1-01

Nginxを使ったロードバランサーの設定について

ロードバランサーの設定① ラウンドロビン

続いてロードバランサーとして利用する場合の設定方法についての紹介します。
Nginxをロードバランサーとして使う場合、特にモジュールを追加する必要はありません。
upstreamモジュールを利用することで、プロキシサーバー群を定義することができるようになります。

設定ファイル
 /etc/nginx/nginx.conf

ロードバランシングメソッドが具体的に設定されていない場合は、デフォルトがラウンドロビンになります。

フロントエンドのNginxのupstreamブロックの設定で、バックエンドのWebサーバーを以下のように指定します。
この設定のみでロードバランサーの下に置くWebサーバーの数を簡単に増減できます。

上の例では、srv1-srv3で動作している同じアプリケーションの3つのインスタンスがあります。
全てのリクエストはサーバーグループhoge.comに proxiedされ、Nginxはリクエストを分配するためにHTTPロードバランシングを適用します。

ロードバランサーの設定② Least Connected

Least Connectedはリクエストの完了に時間が掛かるような場合に、アプリケーションインスタンスの負荷を公平に制御できます。
各アプリケーションインスタンスが保持しているオープン・コネクション数を計測し、コネクション数の少ないサーバーへアクセスを割り振ることで、新しいリクエストはより忙しくないサーバーに分配されます。

ロードバランサーの設定③ IPハッシュ

同じIPアドレスからのアクセスを同じサーバーに振り分けたい場合は、ip_hashを利用します。
IPv4アドレスのクライアントの最初の3オクテット、またはIPv6アドレスの全体が、ハッシュキーとして使われ、このメソッドは同じクライアントからのリクエストはサーバーが利用不可の場合を除いて常に同じサーバーに渡されることを保証します。
尚、接続先のサーバーが利用不可の場合には、クライアントは他のサーバーに渡される動きをします。

サーバーの振り分けに重みをつける

特定のサーバーに対して多めにリクエストを割り振りたいパターンです。以下の例だとapp1:app2:app3 = 3:1:1になります。
今までの例では、すべてのサーバーに対して同等に重みが扱われています。 重みつけのパラメーターを設定することでバランシングのアルゴリズムに影響を与えることが可能です。
(ip-hashでは重みつけが利用出来ません)

例えば5リクエストあった場合に、上記の例ではsrv1に3リクエスト、srv2,3に1リクエストずつバランシングが行われます。

いかがでしたでしょうか?

今回紹介したように、Nginxを利用することで簡単にソフトウェアロードバランサーを導入することが可能です。

次回の2回目では実際に上記の設定を行った後の動作チェックの方法や計測値などについて紹介したいと思います。