是否存在未解析的上游服务器地址的 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.comfoo1.example.comfoo2.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 问题,我正在尝试完成以下任务:

  1. 通过主机名而不是 IP 地址记录上游服务器,因为解析的 IP 地址可能是临时的,或者可能不支持 1:1 反向查找
  2. map上游服务器提供另一条更有用的信息,也用于日志记录目的
  3. 当服务器不共享相同的证书时,为上游 SSL配置主机名验证(例如通过proxy_ssl_name)(这可能需要提出一个问题,但这不是唯一的用例)

(*)= 该变量$upstream_addr似乎并非在请求的所有阶段都可用,例如添加proxy_set_header Upstream-Addr $upstream_addr;到位置块似乎没有效果,这意味着变量为空

答案1

代理可能比较棘手。Nginxproxy_set_header就是您需要的。Nginx 文档

proxy_set_header    Host            $host;

看这里举个例子更详细的代理配置

相关内容