Подтвердить что ты не робот

Динамический proxy_pass для $var с nginx 1.0

Я пытаюсь проксировать запрос для разных целей в зависимости от переменной среды. Мой подход заключался в том, чтобы указать целевой URL в пользовательскую переменную $target и передать это proxy_pass.

Но использование переменной с proxy_pass не работает. Эта простая конфигурация приводит к ответу "502 Bad Gateway" от 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;
  }
}

Аналогичная конфигурация без переменной работает:

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

Действительно ли невозможно использовать proxy_pass таким образом, или я просто делаю что-то неправильно?

4b9b3361

Ответ 1

Я недавно наткнулся на эту необходимость и обнаружил, что для использования переменных в назначении proxy_pass вам нужно установить распознаватель, поскольку ваш error.log, скорее всего, будет содержать что-то вроде no resolver defined to resolve ...

Решение в моем случае состояло в том, чтобы настроить следующее с помощью разрешения Google для DNS:

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

В вашем случае это должно работать:

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

Подробнее о nginx и динамическом proxy_pass здесь: http://www.nginx-discovery.com/2011/05/day-51-proxypass-and-resolver.html

Ответ 2

Наткнулся на ту же самую проблему

proxy_pass не разрешал мои переменные, пока мы не обнаружили, что у нашего DNS-сервера возникла проблема

можно проверить с помощью этого cmd тем путем

nslookup your-domain your-dns-ip

Ответ 3

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