proxy - 使用 nginx 1.0 动态 proxy_pass 到 $var

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

没有变量的相同配置可以工作:

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 还是我只是做错了什么?

最佳答案

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

我的解决方案是使用本地 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 和动态 proxy_pass 的更多信息:http://www.nginx-discovery.com/2011/05/day-51-proxypass-and-resolver.html

编辑: 为了安全起见,将之前的公共(public) DNS 替换为本地 DNS issues .

关于proxy - 使用 nginx 1.0 动态 proxy_pass 到 $var,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5743609/

相关文章:

Java 小程序和代理

php - 如何设置权限以缓存和记录symfony docker容器

nginx - 我可以在 Nginx 中创建一个 "private"位置吗?

node.js - HTTP 代理 (Node.js) 未执行正确的 SSL 验证

android - Charles 代理和丢失的命中

java - Jersey:在后台调用另一个API实现

nginx - sqlite3无法打开数据库文件,运行Centos,flask uwsgi nginx

Apache 和 Nginx 在一起,为什么?

php - {R :1} and {C:1} on iis web. 配置文件之间的差异

Java Proxy.newProxyInstance() 抛出类型转换异常?