我试图根据环境变量将请求代理到不同的目标.我的方法是将目标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以解决安全问题.
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应该是您要转发呼叫的主机名。我尝试使用没有破折号的标头,但必须使用没有破折号的标头。