Saltar al contenido

Proxy_pass dinámico a $ var con nginx 1.0

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_passaquí: 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *