Nginxのリバースプロキシ設定と Host ヘッダーの違い

Nginxをリバースプロキシとして使用する際、バックエンドサーバー(Next.jsなど)へのリクエスト転送を適切に設定することが重要です。本記事では、以下のNginxの設定について解説し、特に proxy_set_header Hostproxy_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;

  • クライアントが httphttps でアクセスしているかをバックエンドに通知します。

2.5. proxy_set_header X-Forwarded-Host $host;

  • クライアントがリクエストした本来のホスト名を X-Forwarded-Host ヘッダーとしてバックエンドに送信します。

proxy_set_header Hostproxy_set_header X-Forwarded-Host の違い

設定説明目的
proxy_set_header Host $host;Nginxがバックエンドに直接送る Host ヘッダーバックエンドがリクエストのホストを認識
proxy_set_header X-Forwarded-Host $host;クライアントがリクエストした本来のホスト情報をバックエンドに伝えるプロキシ経由のリクエストで元のホストをバックエンドに通知

違いのポイント

  1. Host ヘッダーはバックエンドが直接利用するため、マルチドメイン対応や適切なルーティングに影響します。
  2. X-Forwarded-Host は、リバースプロキシを通る前のオリジナルのホスト情報を保持するため、バックエンドが元のリクエストのホストを知る必要がある場合に使用されます。
  3. リバースプロキシ経由のシステムでは、両方設定するのが無難 です。

まとめ

Nginxをリバースプロキシとして使用する際には、適切なヘッダー設定が重要です。proxy_set_header Host はバックエンドのドメイン認識に必要であり、proxy_set_header X-Forwarded-Host はプロキシを通る前のホスト情報をバックエンドに通知する役割を持ちます。両方設定することで、適切なリクエスト処理が可能になります。

この設定を活用し、Next.jsやDjangoなどのバックエンドを安定して運用しましょう。