Cuando se usa nginx como proxy inverso para un grupo de servidores en un bloque ascendente, ¿hay una variable que corresponda al nombre del servidor no resuelto? Por ejemplo, considere la siguiente configuración:
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;
}
}
}
Sean foo.example.com
, foo1.example.com
y foo2.example.com
nombres definidos que se resuelven en 192.0.2.1, 192.0.2.2 y 192.0.2.3 respectivamente.
Supongamos que llega una solicitud foo.example.com
y nginx decide elegir foo2.example.com
el puerto 8080 como servidor ascendente y la solicitud se realiza correctamente. Entonces, que yo sepa, estos serán los valores de algunas variables relevantes:
$host = foo.example.com
$proxy_host = foo
$upstream_addr = 192.0.2.3:8080
(*)
Sin embargo, ninguno de estos coincide con el valor proporcionado en la configuración del servidor ascendente. Entonces, más específicamente, mi pregunta es: ¿qué variable, si la hay, tendrá el valor de foo2.example.com:8080
en este caso?
Para evitar el problema XY, estas son las cosas que intento lograr:
- registrar el servidor ascendente por nombre de host en lugar de por dirección IP, ya que la dirección IP resuelta puede ser temporal o no admitir la búsqueda inversa 1:1
- al
map
servidor ascendente a otra información que sea más útil, también para fines de registro - para configurar la verificación del nombre de host (por ejemplo, a través de
proxy_ssl_name
) para SSL ascendente cuando los servidores no comparten el mismo certificado (esto podría justificar una pregunta propia, pero no es el único caso de uso)
(*) = La variable $upstream_addr
no parece estar disponible en todas las etapas de la solicitud; por ejemplo, agregar proxy_set_header Upstream-Addr $upstream_addr;
al bloque de ubicación parece no tener ningún efecto, lo que implica que la variable está vacía
Respuesta1
Los proxy pueden ser complicados. Nginx proxy_set_header
es lo que quieres.Documentos Nginx
proxy_set_header Host $host;
Mira aquípara un ejemplode una configuración más detallada para proxies