Dynamic proxy_pass à $ var avec nginx 1.0

J’essaie de transmettre une requête à différentes cibles en fonction d’une variable d’environnement. Mon approche consistait à placer l’URL cible dans la variable personnalisée $ target et à la donner à proxy_pass.

Mais utiliser une variable avec proxy_pass ne semble pas fonctionner. Cette configuration simple conduit à une réponse “502 Bad Gateway” de 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 même configuration sans la variable fonctionne:

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

N’est-il pas vraiment possible d’utiliser proxy_pass de cette façon ou est-ce que je fais juste quelque chose de mal?

Je suis récemment tombé sur ce besoin moi-même et j’ai constaté que pour utiliser des variables dans une destination proxy_pass, vous devez définir un résolveur car votre error.log contiendrait probablement quelque chose comme no resolver defined to resolve ...

La solution dans mon cas était de configurer les éléments suivants en utilisant Google pour la résolution DNS:

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

Dans votre cas, cela devrait fonctionner:

 location /proxy { resolver 127.0.0.1 [::1]; set $target http://proxytarget.example.com; proxy_pass $target; } 

Pour que le résolveur 127.0.0.1 fonctionne, vous devez installer bind9 localement. Pour Debian / Ubuntu:

sudo apt-get install bind9

Plus d’informations sur nginx et dynamic proxy_pass ing ici: http://www.nginx-discovery.com/2011/05/day-51-proxypass-and-resolver.html

Modifier: remplace le DNS public précédent par un serveur local pour les problèmes de sécurité.

Trébuché sur le même problème exact

proxy_pass ne résolvait pas mes variables, jusqu’à ce que nous découvrions que notre serveur DNS avait un problème

peut être vérifié avec cette cmd en passant

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