Динамический proxy_pass в $ var с nginx 1.0 - PullRequest
31 голосов
/ 21 апреля 2011

Я пытаюсь прокси-запрос к различным целям в зависимости от переменной среды.Мой подход заключался в том, чтобы поместить целевой 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;
  }
}

Тот же конфиг без переменной работает:Кстати или я просто что-то не так делаю?

Ответы [ 4 ]

61 голосов
/ 26 декабря 2011

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

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

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

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

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

Для работы распознавателя 127.0.0.1 вам необходимо установить bind9 локально. Для Debian / Ubuntu:

sudo apt-get install bind9

Дополнительная информация о nginx и динамическом proxy_pass здесь: http://www.nginx -discovery.com / 2011/05 / day-51-proxypass-and-resolver.html

Edit: Заменил предыдущий общедоступный DNS на локальный для безопасности проблемы .

8 голосов
/ 28 ноября 2018

Несмотря на то, что ответ @soulseekah является полным и правильным, я хочу опубликовать ответ для людей, использующих Nginx, внутри кластера контейнеров, будь то внутри Kubernetes или Docker Compose.распознаватель для Nginx с адресом вашего фактического преобразователя DNS.Для Docker это всегда в 127.0.0.11, для Kubernetes см. этот ответ

Внутри моей докерной сети мне удалось успешно настроить динамический proxy_passпри этом:

resolver 127.0.0.11 [::1];
set $bcknd http://$http_XBackend$uri$is_args$args;
proxy_pass        $bcknd;

Обратите внимание, что было фундаментальным для добавления $uri$is_args$args, поскольку в противном случае проход прокси не учитывал путь и строку запроса.

PS: в моем примере я читаю заголовок, используя переменную $http_XBackend.Заголовок передается клиентом как XBackend: host, здесь host должно быть именем хоста, на который вы хотите переадресовывать свои звонки.Я безуспешно пытался использовать заголовки с тире в них, мне пришлось использовать заголовок без тире.

0 голосов
/ 08 апреля 2016
 location / {
   if ($args ~ "^url=(.+)") { #gets the "url" get parameter
       set $key1 $1;
     proxy_pass $key1;#use the parameter as proxy address
 }
}
0 голосов
/ 04 февраля 2016

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

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

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

nslookup your-domain your-dns-ip
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...