Proxy 使用nginx 1.0将动态代理传递到$var

Proxy 使用nginx 1.0将动态代理传递到$var,proxy,nginx,Proxy,Nginx,我试图根据环境变量将请求代理到不同的目标。我的方法是将目标url放入自定义变量$target中,并将其传递给proxy\u pass 但是使用带有代理传递的变量似乎不起作用。这个简单的配置导致来自nginx的“502坏网关”响应 server { listen 8080; server_name myhost.example.com; access_log /var/log/nginx/myhost.access.log; location /proxy { se

我试图根据环境变量将请求代理到不同的目标。我的方法是将目标url放入自定义变量$target中,并将其传递给proxy\u pass

但是使用带有代理传递的变量似乎不起作用。这个简单的配置导致来自nginx的“502坏网关”响应

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;
  }
}

是否真的不可能以这种方式使用代理传递,或者我只是做错了什么?

我自己最近偶然发现了这种需要,并发现为了在代理传递目标中使用变量,您需要将解析程序设置为错误。日志很可能包含类似于
没有定义解析程序的内容…

在我的案例中,解决方案是使用本地DNS设置以下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和dynamic
proxy\u pass
ing的更多信息,请点击此处:

编辑:
为了安全起见,将以前的公共DNS替换为本地DNS。

偶然发现了同样的问题

在发现DNS服务器出现问题之前,proxy_pass没有解析我的变量

顺便说一下,可以使用此cmd进行检查

nslookup your-domain your-dns-ip

尽管@soulsekah的答案是完整和正确的,但我还是想为在容器集群中使用Nginx的人们发布一个答案,这些容器是Kubernetes或Docker Compose中的

基本上,您必须使用实际DNS解析程序的地址为Nginx配置解析程序。对于Docker,它位于
127.0.0.11
,对于Kubernetes,请参阅

在我的docker网络中,我能够通过这样做成功地配置动态
代理\u通行证

resolver 127.0.0.11 [::1];
set $bcknd http://$http_XBackend$uri$is_args$args;
proxy_pass        $bcknd;
请注意,添加
$uri$is_args$args
非常重要,因为否则代理传递不会考虑路径和查询字符串

PS:在我的示例中,我使用
$http\u XBackend
变量读取标题。客户端将头作为
XBackend:host
传递,这里的
host
应该是要转发呼叫的主机名。我尝试使用带有破折号的标题,但运气不好,我不得不使用没有破折号的标题



编辑2020年7月16日:Docker不再在其网页上报告默认DNS服务器的地址。现在仍然是127.0.0.11:53。如果你想在你的容器中看到这个值,你需要运行
cat/etc/resolv.conf

FYI,Nginx不使用/etc/hosts,无论有没有解析器:对我来说都不起作用。我设置了一个变量,但如果在proxy_pass指令中使用,nginx似乎无法解析它。在proxy_redirect中,相同的变量按预期工作。不要使用可公开访问的DNS服务器,如
8.8.8
。完全限定的域名需要解析器,而不是变量。如果您要传递的变量包含IP地址,则可以正常工作。对于使用Kubernetes的任何人,您都可以使用内部Kube DNS服务:
resolver Kube-DNS.Kube-system.svc.cluster.local valid=5s我将在这里添加一条注释:“127.0.0.11”DNS服务器似乎只适用于用户定义的网络,而不适用于默认网络,因此我会小心使用它,除非在:P:d之前选中它
resolver 127.0.0.11 [::1];
set $bcknd http://$http_XBackend$uri$is_args$args;
proxy_pass        $bcknd;