解決されていないアップストリーム サーバー アドレス用の nginx 変数はありますか?

解決されていないアップストリーム サーバー アドレス用の nginx 変数はありますか?

アップストリーム ブロック内のサーバー グループへのリバース プロキシとして nginx を使用する場合、解決されていないサーバー名に対応する変数はありますか? たとえば、次の構成を検討してください。

http {
    upstream foo {
        server foo1.example.com:8080;
        server foo1.example.com:8081;
        server foo2.example.com:8080;
        server foo2.example.com:8081;
    }
    server {
        server_name foo.example.com;
        location / {
            proxy_pass http://foo;
        }
    }
}

foo.example.com、、foo1.example.comfoo2.example.comそれぞれ 192.0.2.1、192.0.2.2、192.0.2.3 に解決される名前として定義します。

リクエストが到着しfoo.example.com、nginx がアップストリーム サーバーとしてポート 8080 を選択しfoo2.example.com、リクエストが成功したとします。私の知る限り、関連する変数の値は次のようになります。

  • $host = foo.example.com
  • $proxy_host = foo
  • $upstream_addr = 192.0.2.3:8080(*)

ただし、これらのいずれも、アップストリーム サーバーの構成で指定された値と一致しません。したがって、より具体的には、foo2.example.com:8080この場合、どの変数 (存在する場合) に の値が割り当てられるかが質問です。

XY 問題を回避するために、私が達成しようとしていることは次のとおりです。

  1. 解決されたIPアドレスは一時的なものであったり、1:1逆引きをサポートしていない可能性があるため、上流サーバーをIPアドレスではなくホスト名でログに記録する
  2. 上流サーバーにmap、ログ記録の目的にも役立つ別の情報を送信します
  3. サーバーが同じ証明書を共有していない場合、上流 SSL のホスト名検証 ( 経由などproxy_ssl_name) を構成する (これは独自の質問を必要とする可能性がありますが、唯一の使用例ではありません)

(*) = 変数は$upstream_addrリクエストのすべての段階で使用できるわけではないようです。たとえば、proxy_set_header Upstream-Addr $upstream_addr;ロケーション ブロックに追加しても効果がないように見えるため、変数は空であることを意味します。

答え1

プロキシは扱いが難しい場合があります。Nginx のプロキシproxy_set_headerが最適です。Nginx ドキュメント

proxy_set_header    Host            $host;

ここを見て例えばプロキシのより詳細な設定

関連情報