Gibt es eine Nginx-Variable für die nicht aufgelöste Upstream-Serveradresse?

Gibt es eine Nginx-Variable für die nicht aufgelöste Upstream-Serveradresse?

Wenn Sie nginx als Reverse-Proxy für eine Gruppe von Servern in einem Upstream-Block verwenden, gibt es dann eine Variable, die dem nicht aufgelösten Servernamen entspricht? Betrachten Sie beispielsweise die folgende Konfiguration:

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;
        }
    }
}

Lassen Sie foo.example.com, foo1.example.com, und foo2.example.comdefinierte Namen sein, die sich in 192.0.2.1, 192.0.2.2 bzw. 192.0.2.3 auflösen.

Angenommen, es kommt eine Anfrage foo.example.comund nginx entscheidet sich, Port 8080 als Upstream-Server auszuwählen foo2.example.comund die Anfrage ist erfolgreich. Dann sind meines Wissens nach dies die Werte einiger relevanter Variablen:

  • $host = foo.example.com
  • $proxy_host = foo
  • $upstream_addr = 192.0.2.3:8080(*)

Keiner dieser Werte stimmt jedoch mit dem in der Konfiguration für den Upstream-Server angegebenen Wert überein. Meine Frage lautet also genauer: Welche Variable (falls überhaupt) hat foo2.example.com:8080in diesem Fall den Wert?

Um das XY-Problem zu vermeiden, versuche ich Folgendes zu erreichen:

  1. um den Upstream-Server per Hostnamen statt per IP-Adresse zu protokollieren, da die aufgelöste IP-Adresse möglicherweise temporär ist oder keine 1:1-Rückwärtssuche unterstützt
  2. an mapden Upstream-Server zu einer anderen Information, die nützlicher ist, auch für Protokollierungszwecke
  3. um die Hostnamenüberprüfung (z. B. über proxy_ssl_name) für Upstream-SSL zu konfigurieren, wenn die Server nicht dasselbe Zertifikat verwenden (dies könnte eine eigene Frage darstellen, ist aber nicht der einzige Anwendungsfall)

(*) = Die Variable $upstream_addrscheint nicht in allen Phasen der Anfrage verfügbar zu sein. Das Hinzufügen proxy_set_header Upstream-Addr $upstream_addr;zum Standortblock scheint beispielsweise keine Wirkung zu haben, was bedeutet, dass die Variable leer ist.

Antwort1

proxy_set_headerProxys können schwierig sein. Sie benötigen Nginx .Nginx-Dokumente

proxy_set_header    Host            $host;

Schau hierzum Beispieleiner detaillierteren Konfiguration für Proxys

verwandte Informationen