目次
Nginxとは
Nginxは、フリーかつオープンソースのWebサーバーです。
HTTP/HTTPS/SMTP/POP3/IMAPのリバースプロキシの機能に加え、ロードバランサー、HTTPキャッシュの機能を持っています。
Nginxが開発されたのは、Apache httpdのロードバランシング機能に対するパフォーマンス不足からということもあり、Nginxのロードバランシング機能はパフォーマンスが高く、またさまざまな付加機能を持ち合わせています。
Nginxをロードバランサーとして活用する
Nginxの開発元が目標としたのは、高速なWebアクセラレーションです。
Webアクセラレーターは本来のWebサーバーの代わりにクライアントからのリクエストを受け付け、サーバーからのレスポンスをキャッシュ、または複数のサーバーに分散させることでレスポンスを高速化します。
この際に重要になるのが、リバースプロキシ/ロードバランシング機能ですが、今回はNginxのロードバランシング機能について2回に渡り紹介します。
補足 リバースプロキシについて
通常のプロキシはクライアントとインターネットの間に設置され、特定のクライアントから不特定多数のサーバーへのリクエストを中継します。
それに対しリバースプロキシは 逆プロキシと呼ばれ、インターネットとWebサーバーの間に設置され、不特定多数のクライアントから特定のサーバーへのリクエストを中継します。
Nginxのロードバランシグの種類
Nginxでは以下のロードバランシングメカニズム(あるいはメソッド)がサポートされています。
①ラウンドロビン
アプリケーションへのリクエストはラウンドロビンの形式で分配されます
②Least Connected
次のリクエストはアクティブな接続数がもっとも少ないサーバーに割り当てられます
③IPハッシュ
次のリクエストにどのサーバーが選択されるべきかを決めるためにハッシュ関数が使われます(クライアントのIPアドレスに基づく)
Nginxのインストールについて
CentOS6の環境にNginxをインストールする方法を紹介します。
Nginx は CentOS 標準のリポジトリからは提供されていません。そこで、Nginx から提供されているCentOS用のリポジトリファイルを追加します。
リポジトリファイルの作成
1 2 |
# touch /etc/yum.repos.d/nginx.repo # vi /etc/yum.repos.d/nginx.repo |
Nginx のリポジトリファイルの内容
1 2 3 4 5 |
[nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=0 enabled=1 |
yumを使ってインストールする
1 |
# yum install nginx |
以上の作業で、Nginxのインストールは完了です。
Nnginxを起動する
1 2 |
# /etc/init.d/nginx start nginx を起動中: [ OK ] |
Nginxの動作確認
インストールしたサーバのIPアドレスをブラウザのURLに打ち込んでアクセスしてみましょう。
下記のようなページが表示されていればインストール成功です。
Nginxを使ったロードバランサーの設定について
ロードバランサーの設定① ラウンドロビン
続いてロードバランサーとして利用する場合の設定方法についての紹介します。
Nginxをロードバランサーとして使う場合、特にモジュールを追加する必要はありません。
upstreamモジュールを利用することで、プロキシサーバー群を定義することができるようになります。
設定ファイル
/etc/nginx/nginx.conf
ロードバランシングメソッドが具体的に設定されていない場合は、デフォルトがラウンドロビンになります。
フロントエンドのNginxのupstreamブロックの設定で、バックエンドのWebサーバーを以下のように指定します。
この設定のみでロードバランサーの下に置くWebサーバーの数を簡単に増減できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
設定例 ---------------------------------------------------------- http { upstream hoge.com { server srv1.example.com; server srv2.example.com; server srv3.example.com; } server { listen 80; location / { proxy_pass http://hoge.com; } } } ---------------------------------------------------------- |
上の例では、srv1-srv3で動作している同じアプリケーションの3つのインスタンスがあります。
全てのリクエストはサーバーグループhoge.comに proxiedされ、Nginxはリクエストを分配するためにHTTPロードバランシングを適用します。
ロードバランサーの設定② Least Connected
Least Connectedはリクエストの完了に時間が掛かるような場合に、アプリケーションインスタンスの負荷を公平に制御できます。
各アプリケーションインスタンスが保持しているオープン・コネクション数を計測し、コネクション数の少ないサーバーへアクセスを割り振ることで、新しいリクエストはより忙しくないサーバーに分配されます。
1 2 3 4 5 6 7 8 9 10 11 12 |
設定例 ---------------------------------------------------------- http { upstream hoge.com { least_conn; server srv1.example.com; server srv2.example.com; server srv3.example.com; } 以下、省略 ---------------------------------------------------------- |
ロードバランサーの設定③ IPハッシュ
同じIPアドレスからのアクセスを同じサーバーに振り分けたい場合は、ip_hashを利用します。
IPv4アドレスのクライアントの最初の3オクテット、またはIPv6アドレスの全体が、ハッシュキーとして使われ、このメソッドは同じクライアントからのリクエストはサーバーが利用不可の場合を除いて常に同じサーバーに渡されることを保証します。
尚、接続先のサーバーが利用不可の場合には、クライアントは他のサーバーに渡される動きをします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
設定例 ---------------------------------------------------------- http { upstream hoge.com { ip_hash; server srv1.example.com; server srv2.example.com; server srv3.example.com; } } 以下、省略 ---------------------------------------------------------- |
サーバーの振り分けに重みをつける
特定のサーバーに対して多めにリクエストを割り振りたいパターンです。以下の例だとapp1:app2:app3 = 3:1:1になります。
今までの例では、すべてのサーバーに対して同等に重みが扱われています。 重みつけのパラメーターを設定することでバランシングのアルゴリズムに影響を与えることが可能です。
(ip-hashでは重みつけが利用出来ません)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
設定例 ---------------------------------------------------------- http { upstream hoge.com { ip_hash; server srv1.example.com weight=3; server srv2.example.com; server srv3.example.com; } } 以下、省略 ---------------------------------------------------------- |
例えば5リクエストあった場合に、上記の例ではsrv1に3リクエスト、srv2,3に1リクエストずつバランシングが行われます。
いかがでしたでしょうか?
今回紹介したように、Nginxを利用することで簡単にソフトウェアロードバランサーを導入することが可能です。
次回の2回目では実際に上記の設定を行った後の動作チェックの方法や計測値などについて紹介したいと思います。