Home > ブログ > NginxでALBの代替環境を作る

ブログ

NginxでALBの代替環境を作る

WebサイトをAWS(Amazon Web Services)上に構築する際、それなりに大きいサイトならEC2(Webサーバー)の前段にALB(Application Load Balancer)を配置して、Webサーバーを冗長化しておくことが多いかと思います(図1)。

Application Load Balancer
図1 Application Load Balancer

私は開発環境はVMware Workstationを使ってローカルのPC上に構築することが多いのですが、できるだけ本番環境に近い構成にしておきたいため、ALB部分はNginxのHTTPロードバランシング機能を使って代替するようにしています。

今回はALBをNginxで代替するにあたって、どのような設定にしているかの説明です。

作成する構成としては、図2のようなものを想定しています。

Nginx Load Balancer
図2 NginxでALBを代替
  • https://foo.bit-hive.com/という名前のサイトを公開。
  • サイトはhttsのみ提供(httpへのアクセスはhttpsへ転送)。
  • ロードバランサーでSSL終端する(ALBと同じ)。
  • ロードバランサーはLinuxにNginxをインストールして構築。
  • バックエンドのWebサーバーは2台(Linux)。Nginxを使用。

上記をVMware WorkstationでローカルPC上に構築します。

それでは、どのように設定しているかを説明していきます。設定ファイル内に現れるPrivateネットワーク上のIPアドレスがどれに該当するかは図2を参照してください。

ロードバランサーのNginx設定

まずはロードバランサーの設定です。設定の説明はコメントとして記述してあります。

ロードバランサーのNginx設定

# バックエンドのWebサーバーのIPアドレスを列挙
upstream backend {
    server 172.16.180.10;
    server 172.16.180.11;
}

# httpへのアクセスはhttpsへ転送
server {
    listen 80;
    server_name foo.bit-hive.com;
    return 301 https://$host$request_uri;
}
# https://foo.bit-hive.comとしての設定
server {
    listen  443 ssl;
    server_name foo.bit-hive.com;

    include /etc/nginx/foo_default/ssl.conf;

    location / {
        # upstream backendで定義したサーバーのいずれかに転送
        proxy_pass http://backend;
        include /etc/nginx/foo_default/proxy_set_header;
    }

    # 特定のURLは特定のサーバーに転送したい場合はproxy_passでIPアドレスを指定すればよい
    # (ALBのルール設定に相当)
    # 以下は/admin/以下へのアクセスをWebServer1に転送する例
    location /admin/ {
        proxy_pass http://172.16.180.10;
        include /etc/nginx/foo_default/proxy_set_header;
    }
}

基本的な説明はコメント内に記載してありますが、upstream backendでバックエンドのWebサーバーの一覧を指定し、proxy_pass http://backend;で転送先のupstreamのグループを指定するだけです。ちなみに'backend'はただの名前なので別の名前でもかまいません。

proxy_pass http://172.16.180.10;のように転送先のサーバーを固定することもできるので、特定URLだけを固定的に個別のサーバーに転送することもできます。ALBのルール設定と同じですね。

各locationからincludeしているproxy_set_headerは以下のようになっています。

/etc/nginx/foo_default/proxy_set_headerの内容

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

リバースプロキシとして動作させる際のよくある設定ですね。

Webサーバーの設定

次にWebサーバー(WebServer1)側の設定です。こちらは、リバースプロキシ背後でWebサーバーを動作させる時の設定とまったく同じで、代替環境用の考慮はいりません。AWS環境でのEC2でも同じような設定になるはずです。

server {
    # ロードバランサーでSSL終端しているのでlistenは80
    listen       80;
    listen       [::]:80;
    server_name  foo.bit-hive.com foo1.bit-hive.com;
    root         /var/www/html;

    # ロードバランサーからのX-Forwarded-ForヘッダからリモートクライアントのIPを取得
    set_real_ip_from 172.16.180.9;
    real_ip_header X-Forwarded-For;

    # サーバーのIDを適当なヘッダー(ここではX-Backend)に埋め込んで返しておくと
    # HTTPレスポンスをみれば、どのサーバーからの応答かわかるので、
    # 開発/テスト時には役に立つかもしれない。
    add_header X-Backend 1;

    index index.php index.html index.htm;
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # その他の設定は略
}

以上のようにして、ALBを使った冗長化構成とだいたい同じ構成をローカル環境上に作ることができます。

投稿日:2019/04/19 16:27

タグ: Server Nginx

Top

アーカイブ

タグ

作業実績 (7) Server (5) PHP (4) laravel (3) Webアプリ (3) C++ (2) EC-CUBE (2) Nginx (2) CreateJS (1) JavaScript (1) Linux (1) Vue (1) デモ (1) 書籍 (1)

技術的な情報は以下にもあります。