当使用 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配置主机名验证(例如通过
proxy_ssl_name
)(这可能需要提出一个问题,但这不是唯一的用例)
(*)= 该变量$upstream_addr
似乎并非在请求的所有阶段都可用,例如添加proxy_set_header Upstream-Addr $upstream_addr;
到位置块似乎没有效果,这意味着变量为空