Динамический 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 таким образом, или я просто делаю что-то неправильно?
Ответы
Ответ 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
}
}