2011-04-21 11 views
21

Estoy intentando enviar una solicitud por proxy a diferentes destinos dependiendo de una variable de entorno. Mi enfoque fue poner la URL objetivo en la variable personalizada $ target y darle esto a proxy_pass.

Pero el uso de una variable con proxy_pass no parece funcionar. Esta simple configuración lleva a una respuesta de "502 Bad Gateway" desde nginx.

server { 
    listen 8080; 
    server_name myhost.example.com; 
    access_log /var/log/nginx/myhost.access.log; 
    location /proxy { 
    set $target http://proxytarget.example.com; 
    proxy_pass $target; 
    } 
} 

La misma configuración sin las obras de variables:

server { 
    listen 8080; 
    server_name myhost.example.com; 
    access_log /var/log/nginx/myhost.access.log; 
    location /proxy { 
    proxy_pass http://proxytarget.example.com; 
    } 
} 

¿Es realmente posible utilizar PROXY_PASS esta manera o solo estoy haciendo algo mal?

Respuesta

47

He tropezado recientemente en este mismo necesitar y han encontrado que con el fin de utilizar variables en un destino PROXY_PASS es necesario establecer un dispositivo de resolución como su error.log lo más probable contener algo así como no resolver defined to resolve ...

La solución en mi caso fue la siguiente configuración a través de Google para la resolución DNS:

location ~ /proxy/(.*) { 
    resolver 8.8.8.8; 
    proxy_pass http://$1; 
} 

en su caso esto debería funcionar:

location /proxy { 
    resolver 8.8.8.8; 
    set $target http://proxytarget.example.com; 
    proxy_pass $target; 
} 

Más información sobre nginx y dinámica proxy_pass ing aquí: http://www.nginx-discovery.com/2011/05/day-51-proxypass-and-resolver.html

+1

FYI, Nginx no utiliza/etc/hosts, con o sin resolver: http: //serverfault.c om/questions/357719/nginx-domain-resolver – richardkmiller

+3

No funciona para mí. Establecí una variable, pero parece que nginx no puede resolverlo si se usa en la directiva proxy_pass. En proxy_redirect, la misma variable funciona como se esperaba. – shylynx

+1

No ** Utilice ** un servidor DNS de acceso público, como '8.8.8.8'. [Para evitar la falsificación de DNS, se recomienda configurar los servidores DNS en una red local de confianza debidamente asegurada.] (Http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver) – Tim

0

tropezado con el problema exactamente el mismo

PROXY_PASS no resolvía mi variables, hasta que nos dimos cuenta de nuestro servidor DNS tenía un problema

puede ser comprobado con este cmd por cierto

nslookup your-domain your-dns-ip 
-1
location/{ 
    if ($args ~ "^url=(.+)") { #gets the "url" get parameter 
     set $key1 $1; 
    proxy_pass $key1;#use the parameter as proxy address 
} 
} 
+3

actualice su respuesta con alguna explicación. –

Cuestiones relacionadas