Nginxで構築するL7ロードバランサー

「SAVACAN」担当のMKです。

以前のブログ記事で、KeepalivedとLVSを使用したL4ロードバランサーの構築方法についてご紹介しました。今回は、Nginxを用いたL7ロードバランサーの構築について詳しく解説いたします。

L4ロードバランサーとL7ロードバランサーの仕組みや、その違いについては前回の「KeepalivedとLVSで構築するL4ロードバランサー」の記事にてご説明していますので、ぜひそちらもご参照ください。

まずは、L7ロードバランサーの主な用途について、簡単にご紹介させて頂きます。

目次

L7ロードバランサーの用途

L7ロードバランサーは、1つのドメイン内でURLに基づいて振り分け先のサーバーを変更する際に非常に有効です。
これにより、バックエンドサーバーの負荷を軽減し、セキュリティを高めることができます。

SSLを終端する事が可能なので、バックエンドサーバーをhttpsから解放し、構造を簡略化する事が出来ます。
また、レスポンスをキャッシュさせる事でバックエンドサーバーの負荷を軽減する目的に利用する事も多いです。

今回はSSLの終端と、リバースプロキシによるバックエンドサーバーへのリクエスト振り分ける設定を解説します。
設定する内容については、記載した上から順に判定されますので以下のように設定します。

  • https://yourdomain.com/user/

/user/にきたアクセスをユーザー画面のサーバーに振り分け先設定

  • https://yourdomain.com/kanri/

/kanri/にきたアクセスを管理画面のサーバーに振り分け先設定

  • https://yourdomain.com/

ドメインのみできたアクセスの振り分け先設定

  • https://yourdomain.com/

上記のURLルールに当てはまらないアクセスの振り分け先設定

それでは、設定方法について詳しくご説明いたします。

nginxの設定

Nginxがすでにインストールされており、443ポートを使用する設定についてご説明いたします。

設定を/etc/nginx/nginx.conf に直接追記していくとNginxの設定の記述が冗長となり、複雑で分かりづらくなるため今回のL7ロードバランサーに関する設定は /etc/nginx/conf.d/default.conf に別途作成して行っています。

この default.conf ファイルは、nginx.conf 内の下記のデフォルト定義で読み込まれます。
該当箇所を変更または削除している場合は修正が必要です。

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

以下に示すのは、Nginxで基本的な振り分けを行うための最低限の設定となります。http_user_agent 関数を使用してユーザーエージェントに基づいて転送先を切り替えることも可能ですので、環境に合わせて変更を行ってください。

# /user/のアクセス転送先サーバーの設定
upstream user {
    # アクセス元が同一IPの場合に前回と同じバックエンドに転送
    ip_hash;
    server XXX.XXX.XXX.11:443;
    server XXX.XXX.XXX.12:443;
}

# /kanri/のアクセス転送先サーバーの設定
upstream kanri {
    ip_hash;
    server XXX.XXX.XXX.13:443;
    server XXX.XXX.XXX.14:443;
}


server {
    listen 443 ssl http2;
    server_name yourdomain.com;

    # カスタムエラーページを表示
    proxy_intercept_errors on;
    error_page 500 502 503 504 =503 @fallback;

    # SSL証明書の設定です。パスは環境に合わせて記述してください
    ssl_certificate /etc/nginx/ssl.key/filecrt/YYYYMMDD_yourdomain.com.crt;
    ssl_certificate_key /etc/nginx/ssl.key/key/YYYYMMDD_yourdomain.com.key;

    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers  'ECDH:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128:AES256:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK';
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 10m;
    proxy_next_upstream error timeout;
    port_in_redirect                   off;
    add_header      Front-End-Https    on;

    # /user/にきたアクセスの振り分け内容設定
    location ~* ^/user/ {
        # 転送先サーバーへのリトライ回数(0で無制限)
        proxy_next_upstream_tries 1;
        # 転送先サーバーへのリトライ間隔(0で無制限)
        proxy_next_upstream_timeout 10s;

        proxy_pass https://user;
    }

    # /kanri/にきたアクセスの振り分け内容設定
    location ~* ^/kanri/ {
        proxy_next_upstream_tries 1;
        proxy_next_upstream_timeout 10s;

        proxy_pass https://kanri;
    }

    # error_pageで指定したステータスコードの場合にカスタムエラーページを表示できる
    location @fallback {
        # エラー画面に外部から直接URL指定でアクセスできないように内部リクエストのみ許可しておく
        internal;
        index index.html;
        root /usr/share/nginx/html/;

        # アクセスURLを変更せずエラー画面を表示
        set $page "/error.html";
        proxy_pass https://yourdomein.com$page;
    }

    # ドメインのみでのアクセスをuser画面に振り分け
    location = / {
        proxy_next_upstream_tries 1;
        proxy_next_upstream_timeout 10s;

        proxy_pass https://user;
    }

    # robots.txtや攻撃的アクセスなど上記のURLルールに当てはまらないアクセスをuser画面に振り分け
    location / {
        proxy_next_upstream_tries 1;
        proxy_next_upstream_timeout 10s;

        proxy_pass https://user;
    }
}

# IPアドレスでL7ロードバランサーにアクセスされた場合は必要に応じて拒否します
server {
    listen 443 ssl;
    server_name XXX.XXX.XXX.10;

    root /usr/share/nginx/html/;
    allow (your ip address);
    deny all;
}

上記の設定により、アクセスURLに応じて振り分け先サーバーを切り替えることが可能です。

Nginxを利用したL7ロードバランサー運用と実績

高トラフィック環境での実績
Nginxを利用したL7ロードバランサーは、高トラフィックな環境でも十分に対応可能です。
弊社では、フロントにL4ロードバランサ―を配置し、複数台のNginx L7ロードバランサーへ分散する形で1日2,500万PV規模の大規模ウェブサイトを安定運用しています。
NginxによるL7ロードバランサーが高い性能と信頼性を誇ることが実証出来ており、巨大なトラフィックが発生するサイトでも十分運用できることが確認されました。

まとめ
メンテナンス性を考慮すると専用機器が勝る面も大きいのですが導入コストがかかりますし、この規模感ですと従量課金のクラウドサービス費用もばかになりません。そんな場合に、低コストで導入可能なNginxを利用したL7ロードバランサーは非常に効果的な選択肢になるかと思います。是非検討してみて下さい。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次