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.com
definierte 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.com
und nginx entscheidet sich, Port 8080 als Upstream-Server auszuwählen foo2.example.com
und 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:8080
in diesem Fall den Wert?
Um das XY-Problem zu vermeiden, versuche ich Folgendes zu erreichen:
- 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
- an
map
den Upstream-Server zu einer anderen Information, die nützlicher ist, auch für Protokollierungszwecke - 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_addr
scheint 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_header
Proxys können schwierig sein. Sie benötigen Nginx .Nginx-Dokumente
proxy_set_header Host $host;
Schau hierzum Beispieleiner detaillierteren Konfiguration für Proxys