2014年9月24日水曜日

Nifty Cloud でのNGINX Plus 導入3

こんにちは、村田です。
3回目はNginxのリバースプロキシ機能を利用したロードバランシングを行います。

1台のNginxで処理できる負荷であれば、ロードバランシングをしない方がパフォーマンスは高いのですが、クライアントからのアクセスが多いサイト、特にBtoCのサイトではロードバランシング機能が必要になるケースが出てきます。

クラウド環境ではアプライアンスのハードウェアロードバランサーを導入しにくい場合もありますが、Nginxで解決できるケースも多くしかもコストも抑えられるので、クラウド環境との相性が良いといえます。今回の構成は以下のようなイメージになります。

設定を開始する前にデフォルトの設定を見てみましょう。
/etc/nginx/nginx.conf の設定は以下の通りです。

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


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

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

細かな設定項目は別の機会で解説をしたいと思いますが、今回の設定で重要になるのは httpディレクティブ から始まる項目です。

まず、Webサーバーとして利用するサーバー2台の nginx.conf の設定を変更します。
httpディレクティブ内に server ディレクティブを下記のように追記します。

serverディレクティブは仮想サーバーの設定を行う項目で、listen にて IPアドレスやポートもしくはホスト名(UNIXドメインソケットパス)を記述します。(ここは環境に合わせて変更してください) root ディレクティブにてドキュメントルートの設定を行います。

※ドキュメントルートの設定は serverディレクティブ内で設定することが推奨されます。

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

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

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;

    server {
        listen [WebサーバーのIPアドレスもしくはホスト名];
        root /usr/share/nginx/html;
        }
    }
}

設定が完了したら Nginx を再起動して設定を反映させます。WebサーバーのIPアドレスもしくはホスト名にアクセスを行い、サンプルページもしくは用意したコンテンツが見えることを確認してください。

# service nginx restart
nginx を停止中:                                            [  OK  ]
nginx を起動中:                                            [  OK  ]

NGINX Plus であれば以下の項目を serverディレクティブ内に記述することで、ライブで Nginx のステータスを取得できるようになります。

        location = /status {
            status;

Live load-balancing status の画面は以下のようになります。実際に動作しているところは Nginx Inc.のデモをご覧ください。

Webサーバーの準備ができたなら、ロードバランサーとして動かす Nginx の設定を行います。
設定項目は以下の3点と非常に簡単に行えます。

  1. httpディレクティブ内に upstream_backend ディレクティブの設定を記述します。
    Webサーバーとして設定たサーバーのIPアドレスもしくはホスト名を指定します。
  2. serverディレクティブを作成し、仮想サーバーの設定を行う。
    この項目は先程のWebサーバーの設定と基本は同じです。
  3. locationディレクティブを作成し、proxy_pass の設定を記述します。
    今回は location に / (ルート) を設定することで、全てのコンテンツをWebサーバーに流します。
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    upstream backend {
    server [1台目のWebサーバーのIPもしくはホスト名];
    server [2台目のWebサーバーのIPもしくはホスト名];
    }

    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;

    server {
        listen [ロードバランサーのIPアドレスもしくはホスト名];
        root /usr/share/nginx/html;
        location = / {
            proxy_pass http://backend;
        }
        status_zone backend;
        location = /status {
            status;
        }
    }
}

これでNginxによるロードバランシングの設定が完了です。Nginxを再起動ます。

# service nginx restart
nginx を停止中:                                            [  OK  ]
nginx を起動中:                                            [  OK  ]

それぞれのサーバーの index.hrml にホスト名や IPアドレスを埋め込むことで視覚的にロードバランシングが行われているかを確認することができます。また、/var/log/nginx/access.log を確認することでもロードバランシングの設定効果を見ることができます。

この様に、簡単な設定でロードバランシングまで行えます。
導入の敷居も非常に低いのでWebサーバーのパフォーマンスにお困りの方は一度試してみてはいかがでしょうか。

0 件のコメント:

コメントを投稿