2011-04-21 19 views
21

Sto provando a inoltrare una richiesta a target diversi a seconda di una variabile di ambiente. Il mio approccio era quello di inserire l'URL di destinazione nella variabile personalizzata $ target e assegnarlo a proxy_pass.

Ma l'utilizzo di una variabile con proxy_pass non sembra funzionare. Questa semplice configurazione porta ad una risposta "502 Bad Gateway" da 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 stessa configurazione senza le opere variabili:

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

Non è davvero possibile utilizzare proxy_pass in questo modo o sto solo facendo qualcosa di sbagliato?

risposta

47

Ho recentemente imbattuto in questo bisogno di me e hanno scoperto che, al fine di utilizzare le variabili in una destinazione proxy_pass è necessario impostare un resolver come error.log sarebbe molto probabilmente conterrà qualcosa come no resolver defined to resolve ...

La soluzione nel mio caso è stato quello di impostare le seguenti utilizzando Google per la risoluzione DNS:

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

nel tuo caso questo dovrebbe funzionare:

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

Maggiori informazioni sul nginx e dinamico proxy_pass ing qui: http://www.nginx-discovery.com/2011/05/day-51-proxypass-and-resolver.html

+1

FYI, Nginx non usa/etc/hosts, con o senza resolver: http: //serverfault.c om/questions/357719/nginx-domain-resolver – richardkmiller

+3

Non funziona per me. Ho impostato una variabile, ma sembra che nginx non possa risolverlo se usato nella direttiva proxy_pass. In proxy_redirect la stessa variabile funziona come previsto. – shylynx

+1

Do ** NOT ** usa un server DNS accessibile pubblicamente come '8.8.8.8'. [Per prevenire lo spoofing del DNS, si consiglia di configurare i server DNS in una rete locale affidabile e protetta.] (Http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver) – Tim

0

imbattuto sul problema esattamente lo stesso

proxy_pass non risolvendo le mie variabili, fino a quando abbiamo scoperto che il nostro server DNS ha avuto un problema

può essere controllato con questa cmd dal modo in cui

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

aggiorna la tua risposta con qualche spiegazione. –

Problemi correlati