Nginx を使用して静的 Web サイトを構築したり、リバースプロキシとして機能させたりすることができます。リバースプロキシは、クライアントリクエストを他のバックエンドアプリケーションに転送します。この Topic では、Serverless App Engine (SAE) を使用して Nginx サービスをデプロイする方法について説明します。
ソリューション概要
次の図に示すように、Nginx は、アプリケーション自体から HTML ページなどの静的リソースを返すか、クライアントリクエストの URI に基づいて他のバックエンドアプリケーションにリクエストを転送できます。その後、Nginx はクライアントに応答を返します。
Nginx サービスをデプロイして、静的 Web サイトのみを構築することもできます。このシナリオでは、バックエンドアプリケーションをデプロイしたり、Nginx 構成に転送ルールを含めたりする必要はありません。
1. 静的 Web サイトリソースの準備
この Topic では、次のサンプルファイルを使用します: nginx-demo.zip。
この例で使用される静的 Web サイトリソースは、html/ フォルダに含まれています:
index.html: デフォルトのインデックスページ。error.html: デフォルトの 404 エラーページ。
本番環境では、必要に応じて HTML ページ、イメージ、CSS スタイルなどの静的 Web サイトリソースを作成できます。
2. Nginx 構成ファイルの作成
この例の conf/ フォルダには、Nginx 構成ファイル nginx.conf が含まれています。次のセクションでは、構成について説明します。
本番環境では、要件に基づいて Nginx 構成ファイルを変更できます。詳細については、「Nginx 公式ドキュメント」をご参照ください。
静的リソースのアクセスルールの構成
...
server {
listen 80 default_server; # Web サービスのリスナーポートを 80 に設定します。
...
root /usr/share/nginx/html;
include /etc/nginx/default.d/*.conf;
# クライアントがルートパスにアクセスしたときに返すページ。
location / {
root /usr/share/nginx/html; # 静的 Web サイトリソースが格納されるコンテナー内のパス。イメージをビルドすると、ローカルの静的 Web サイトリソースがイメージ内のこのパスにコピーされます。
index index.html;
}
# クライアントで 404 エラーが発生した場合に返すページ。
error_page 404 /error.html;
location = /error.html {
root /usr/share/nginx/html;
}
}
...転送ルールの構成
このセクションでは、インターネットからアクセス可能なバックエンドアプリケーションをデプロイ済みであることを前提としています。
この例では、バックエンドアプリケーションのエンドポイントとポートは 121.40.xx.xx:80 です。URI が /api/* に一致するリクエストをバックエンドアプリケーションに転送し、URI パスを /* に書き換えるには、次の構成を使用します:
...
# リクエスト転送ルールを構成します。
location /api/ {
proxy_pass http://121.40.xx.xx:80/;
}
...静的 Web サイトのみを構築する場合は、転送ルールを構成する必要はありません。
デプロイされた Nginx サービスが Virtual Private Cloud (VPC) ネットワーク経由でバックエンドアプリケーションにアクセスできる場合は、転送ルールでプライベート IP アドレスを使用できます。
3. イメージをビルドしてイメージリポジトリにアップロードする
ローカル環境または Elastic Compute Service (ECS) インスタンスでイメージをビルドできます。環境に Docker がインストールされていることを確認してください。
Dockerfile を作成します。次のコードは、Dockerfile のサンプルを示しています:
# Nginx ベースイメージを指定します。 FROM nginx:1.20.2 # ローカルの Nginx 構成ファイルをコンテナー環境の指定されたパスにコピーします。 COPY conf/nginx.conf /etc/nginx/nginx.conf # ローカルの静的リソースファイルをコンテナー環境の指定されたパスにコピーします。 COPY html /usr/share/nginx/htmlイメージをビルドします。Dockerfile があるディレクトリで次のコマンドを実行します:
docker build . -t my-nginx:1.0 # .: 現在のディレクトリにイメージをビルドします。 # -t: イメージ名とタグを指定します。イメージをテストします。
# イメージを実行します。 docker run -d -p 80:80 my-nginx:1.0 # 環境に curl コマンドがインストールされている必要があります。 # 静的リソースへのアクセスをテストします。 curl localhost:80/ # バックエンドアプリケーションへのリクエスト転送をテストします。これは、Nginx サービスがパブリック IP アドレスを使用してバックエンドアプリケーションにリクエストを転送する場合にのみ適用されます。 curl localhost:80/api/イメージを Alibaba Cloud Container Registry (ACR) イメージリポジトリにプッシュします。詳細については、「イメージのプッシュとプル (Enterprise Edition)」または「イメージのプッシュとプル (Personal Edition)」をご参照ください。
4. イメージから Nginx をデプロイし、ネットワークアクセスを構成する
ACR にプッシュしたイメージから Nginx サービスをデプロイします。詳細については、「イメージからのアプリケーションのデプロイ」をご参照ください。
Nginx サービスがバックエンドアプリケーションのパブリックエンドポイントにリクエストを転送するようにするには、Nginx サービスが存在する VPC のインターネット NAT ゲートウェイを構成します。デフォルトでは、SAE にデプロイされたアプリケーションはインターネットにアクセスできません。詳細については、「SAE アプリケーションがインターネットにアクセスできるようにインターネット NAT ゲートウェイを構成する」をご参照ください。
Nginx サービスがバックエンドアプリケーションのプライベートエンドポイントを使用してリクエストを転送する場合、NAT ゲートウェイを構成する必要はありません。
クライアントがパブリック IP アドレスを使用してサービスにアクセスできるように、Nginx サービスにパブリックエンドポイントを構成します。詳細については、「CLB インスタンスをアプリケーションにアタッチして、パブリックまたはプライベートエンドポイントを生成する」をご参照ください。[コンテナポート] を
80に設定します。クライアントがドメイン名経由で Nginx サービスにアクセスするようにしたい場合は、パブリック IP アドレスの名前解決を構成します。
ブラウザから Nginx サービスにアクセスしてテストします。
5. (任意) デプロイ後に Nginx 構成ファイルを変更する
Nginx 構成ファイルを変更するために、イメージを再ビルドする必要はありません。ConfigMap を使用して構成ファイルをコンテナーに挿入し、効率的な構成管理を行うことができます。
ConfigMap を使用してコンテナーに挿入された構成ファイルは、コンテナー内の元の構成ファイルを上書きします。
Nginx アプリケーションの名前空間に設定項目 (ConfigMap) を作成します。詳細については、「設定項目 (ConfigMap) の作成」をご参照ください。[設定項目名] を
nginxに設定します。キーがnginx.confの変数を追加し、その値を変更された構成ファイルの内容に設定します。
ConfigMap を使用して構成ファイルを挿入し、アプリケーションを再デプロイします。詳細については、「構成の挿入」をご参照ください。[設定項目] には、前のステップで作成した
nginxConfigMap を選択します。[キー] には、nginx.confを選択します。[マウントパス] を/etc/nginx/nginx.confに設定します。このパスは、イメージ内の Nginx 構成ファイルの場所です。
アプリケーションがデプロイされた後、WebShell を使用して特定のアプリケーションインスタンスにログインし、構成ファイルが変更されたことを確認します。
