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

アーカイブ

タグ

Server (28) 作業実績 (21) PHP (19) ネットワーク (17) プログラミング (15) OpenSSL (10) C (8) C++ (8) PHP関連更新作業 (8) EC-CUBE (7) Webアプリ (7) laravel (6) 書籍 (5) Nginx (5) Linux (5) AWS (4) Vue.js (4) JavaScript (4) 与太話 (4) Rust (3) Symfony (2) お知らせ (2) Golang (2) OSS (1) MySQL (1) デモ (1) CreateJS (1) Apache (1)