當使用 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決定選擇foo2.example.com
8080埠作為上游伺服器,請求成功。然後,據我所知,這些將是一些相關變數的值:
$host = foo.example.com
$proxy_host = foo
$upstream_addr = 192.0.2.3:8080
(*)
但是,這些值都不與上游伺服器配置中給定的值相符。所以,更具體地說,我的問題是:foo2.example.com:8080
在這種情況下哪個變數(如果有)的值為?
為了避免 XY 問題,這些是我試圖完成的事情:
- 透過主機名稱而不是 IP 位址記錄上游伺服器,因為解析的 IP 位址可能是臨時的或可能不支援 1:1 反向查找
- 到
map
上游伺服器到另一個更有用的信息,也用於日誌記錄目的 - 當伺服器不共用相同的憑證時,為上游 SSL配置主機名稱驗證(例如,via
proxy_ssl_name
)(這可能會產生一個自己的問題,但這不是唯一的用例)
(*) = 該變數$upstream_addr
似乎並非在請求的所有階段都可用,例如新增proxy_set_header Upstream-Addr $upstream_addr;
至位置區塊似乎沒有效果,這表示該變數為空