Solución:
Recientemente me encontré con esta necesidad y descubrí que para usar variables en un destino de proxy_pass, debe configurar un solucionador ya que su error.log probablemente contenga algo como no resolver defined to resolve ...
La solución en mi caso fue configurar lo siguiente usando un DNS local para la resolución de DNS:
location ~ /proxy/(.*) {
resolver 127.0.0.1 [::1];
proxy_pass http://$1;
}
En su caso, esto debería funcionar:
location /proxy {
resolver 127.0.0.1 [::1];
set $target http://proxytarget.example.com;
proxy_pass $target;
}
Para que el resolver 127.0.0.1 funcione, debe instalar bind9 localmente. Para Debian / Ubuntu:
sudo apt-get install bind9
Más información sobre nginx y dynamic proxy_pass
aquí: http://www.nginx-discovery.com/2011/05/day-51-proxypass-and-resolver.html
Editar: reemplazó el DNS público anterior por uno local por problemas de seguridad.
Aunque la respuesta de @soulseekah es completa y correcta, quiero publicar una respuesta para las personas que usan Nginx dentro de un grupo de contenedores, ya sea dentro de Kubernetes o Docker Compose.
Básicamente, debe configurar un resolutor para Nginx con la dirección de su resolutor de DNS real. Para Docker siempre está en 127.0.0.11
, para Kubernetes, consulte esta respuesta
Dentro de mi red de Docker pude configurar con éxito una dinámica proxy_pass
al hacerlo:
resolver 127.0.0.11 [::1];
set $bcknd http://$http_XBackend$uri$is_args$args;
proxy_pass $bcknd;
Tenga en cuenta que fue fundamental agregar el $uri$is_args$args
ya que, de lo contrario, el paso del proxy no tuvo en cuenta la ruta y la cadena de consulta.
PD: en mi ejemplo, estoy leyendo un encabezado usando el $http_XBackend
variable. El cliente pasa el encabezado como XBackend: host
, aquí el host
debe ser el nombre de host al que desea reenviar sus llamadas. Intenté usar encabezados con guiones sin suerte, tuve que usar un encabezado sin guiones.
Edición 16 de julio de 2020: Docker ya no informa en su página web la dirección del servidor DNS predeterminado. Sigue siendo 127.0.0.11:53. Si desea ver este valor dentro de su contenedor, debe ejecutar cat /etc/resolv.conf
.