使用nginx 1.0动态proxy_pass到$ var

Seb*_*uer 35 proxy nginx

我试图根据环境变量将请求代理到不同的目标.我的方法是将目标url放入自定义变量$ target并将其提供给proxy_pass.

但是使用带有proxy_pass的变量似乎不起作用.这个简单的配置导致nginx的"502 Bad Gateway"响应.

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

没有变量的相同配置有效:

server {
  listen   8080;
  server_name  myhost.example.com;
  access_log  /var/log/nginx/myhost.access.log;
  location /proxy {
    proxy_pass http://proxytarget.example.com;
  }
}
Run Code Online (Sandbox Code Playgroud)

是不是真的不能以这种方式使用proxy_pass,或者我只是做错了什么?

sou*_*kah 63

我最近偶然发现了这个需求,并发现为了在proxy_pass目的地中使用变量,你需要设置一个解析器,因为你的error.log很可能包含类似的内容. no resolver defined to resolve ...

我的解决方案是使用Google进行DNS解析设置以下内容:

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

在你的情况下,这应该工作:

location /proxy {
    resolver 127.0.0.1 [::1];
    set $target http://proxytarget.example.com;
    proxy_pass $target;
}
Run Code Online (Sandbox Code Playgroud)

要使解析器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

编辑:将以前的公共DNS替换为本地DNS以解决安全问题.

  • 仅供参考,Nginx 不使用 /etc/hosts,无论是否使用解析器:http://serverfault.com/questions/357719/nginx-domain-resolver (3认同)
  • 对我不起作用.我设置了一个变量,但是如果在proxy_pass指令中使用,似乎nginx无法解析它.在proxy_redirect中,相同的变量按预期工作. (3认同)
  • 完全限定域名需要解析器,而不是变量。如果您传递的变量包含 IP 地址,则它可以正常工作。 (3认同)
  • 不要**使用公共可访问的DNS服务器,例如`8.8.8.8`.[为了防止DNS欺骗,建议在正确安全的受信任本地网络中配置DNS服务器.](http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver) (2认同)
  • 对于使用Kubernetes的任何人,您都可以使用内部Kube DNS服务:`resolver kube-dns.kube-system.svc.cluster.local valid = 5s;`http://stackoverflow.com/questions/43326913/nginx-proxy-pass指令字串插值/ 43341304#43341304 (2认同)

Nar*_*sim 10

即使@soulseekah的答案是完整而正确的,我也想为使用Nginx的人们在一组容器中发布答案,这些容器是Kubernetes或Docker Compose中的那些容器。

基本上,您必须使用实际DNS解析器的地址为Nginx配置解析器。对于Docker来说总是127.0.0.11,对于Kubernetes可以参考这个答案

在我的docker网络内部,我能够通过以下方式成功配置动态proxy_pass

resolver 127.0.0.11 [::1];
set $bcknd http://$http_XBackend$uri$is_args$args;
proxy_pass        $bcknd;
Run Code Online (Sandbox Code Playgroud)

请注意,添加至关重要$uri$is_args$args因为否则代理传递不考虑路径和查询字符串。

PS:在我的示例中,我正在使用$http_XBackend变量读取标头。客户端将标头传递为XBackend: host,此处host应该是您要转发呼叫的主机名。我尝试使用没有破折号的标头,但必须使用没有破折号的标头。

  • 我将在此处添加评论:似乎“127.0.0.11”DNS 服务器仅适用于用户定义的网络,而不适用于默认网络,因此我会谨慎使用它,除非之前检查过工作:P :D (3认同)