アップストリーム ブロック内のサーバー グループへのリバース プロキシとして 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.com
をfoo2.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 問題を回避するために、私が達成しようとしていることは次のとおりです。
- 解決されたIPアドレスは一時的なものであったり、1:1逆引きをサポートしていない可能性があるため、上流サーバーをIPアドレスではなくホスト名でログに記録する
- 上流サーバーに
map
、ログ記録の目的にも役立つ別の情報を送信します - サーバーが同じ証明書を共有していない場合、上流 SSL のホスト名検証 ( 経由など
proxy_ssl_name
) を構成する (これは独自の質問を必要とする可能性がありますが、唯一の使用例ではありません)
(*) = 変数は$upstream_addr
リクエストのすべての段階で使用できるわけではないようです。たとえば、proxy_set_header Upstream-Addr $upstream_addr;
ロケーション ブロックに追加しても効果がないように見えるため、変数は空であることを意味します。
答え1
プロキシは扱いが難しい場合があります。Nginx のプロキシproxy_set_header
が最適です。Nginx ドキュメント
proxy_set_header Host $host;
ここを見て例えばプロキシのより詳細な設定