Nginxをリバースプロキシとして使用する際、バックエンドサーバー(Next.jsなど)へのリクエスト転送を適切に設定することが重要です。本記事では、以下のNginxの設定について解説し、特に proxy_set_header Host
と proxy_set_header X-Forwarded-Host
の違いに焦点を当てます。
Nginxのリバースプロキシ設定(Next.jsを例に)
location / {
proxy_pass http://node:3000;
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;
proxy_set_header X-Forwarded-Host $host;
}
この設定では、http://node:3000
で動作するNext.jsアプリケーションに対し、クライアントからのリクエストを転送しています。各ディレクティブの役割を解説します。
1. proxy_pass http://node:3000;
- リクエストを
http://node:3000
に転送します。 node
はDockerコンテナや内部DNSで解決されるホスト名で、Next.jsのサーバーを指します。
2. proxy_set_header
の各ヘッダー設定
2.1. proxy_set_header Host $host;
- クライアントから受け取った
Host
ヘッダーを、そのままバックエンドに転送します。 - Next.jsやDjangoなどのバックエンドは、このヘッダーを元にドメインベースのルーティングを行います。
2.2. proxy_set_header X-Real-IP $remote_addr;
- クライアントの実際のIPアドレスをバックエンドに通知します。
2.3. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- クライアントの元のIPを
X-Forwarded-For
ヘッダーに追加し、複数のプロキシを経由しても元のIPを追跡できるようにします。
2.4. proxy_set_header X-Forwarded-Proto $scheme;
- クライアントが
http
かhttps
でアクセスしているかをバックエンドに通知します。
2.5. proxy_set_header X-Forwarded-Host $host;
- クライアントがリクエストした本来のホスト名を
X-Forwarded-Host
ヘッダーとしてバックエンドに送信します。
proxy_set_header Host
と proxy_set_header X-Forwarded-Host
の違い
設定 | 説明 | 目的 |
---|---|---|
proxy_set_header Host $host; | Nginxがバックエンドに直接送る Host ヘッダー | バックエンドがリクエストのホストを認識 |
proxy_set_header X-Forwarded-Host $host; | クライアントがリクエストした本来のホスト情報をバックエンドに伝える | プロキシ経由のリクエストで元のホストをバックエンドに通知 |
違いのポイント
Host
ヘッダーはバックエンドが直接利用するため、マルチドメイン対応や適切なルーティングに影響します。X-Forwarded-Host
は、リバースプロキシを通る前のオリジナルのホスト情報を保持するため、バックエンドが元のリクエストのホストを知る必要がある場合に使用されます。- リバースプロキシ経由のシステムでは、両方設定するのが無難 です。
まとめ
Nginxをリバースプロキシとして使用する際には、適切なヘッダー設定が重要です。proxy_set_header Host
はバックエンドのドメイン認識に必要であり、proxy_set_header X-Forwarded-Host
はプロキシを通る前のホスト情報をバックエンドに通知する役割を持ちます。両方設定することで、適切なリクエスト処理が可能になります。
この設定を活用し、Next.jsやDjangoなどのバックエンドを安定して運用しましょう。