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

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

- 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