未解析的上游伺服器位址是否有 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.com、 和foo2.example.com分別為解析為 192.0.2.1、192.0.2.2 和 192.0.2.3 的定義名稱。

假設有一個請求進來foo.example.com,nginx決定選擇foo2.example.com8080埠作為上游伺服器,請求成功。然後,據我所知,這些將是一些相關變數的值:

  • $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配置主機名稱驗證(例如,via proxy_ssl_name)(這可能會產生一個自己的問題,但這不是唯一的用例)

(*) = 該變數$upstream_addr似乎並非在請求的所有階段都可用,例如新增proxy_set_header Upstream-Addr $upstream_addr;至位置區塊似乎沒有效果,這表示該變數為空

答案1

代理可能很棘手。 Nginxproxy_set_header就是你想要的。Nginx 文檔

proxy_set_header    Host            $host;

看這裡舉個例子更詳細的代理配置

相關內容