proxy_pass中的nginx变量(cname)

时间:2013-03-21 19:04:40

标签: nginx

我正在尝试动态设置proxy_pass目标,其中变量将是原始请求的cname。

我现在拥有的是:

server {
    listen       8888;
    server_name (.*).domain.com;

    location / {
        proxy_pass       http://$1.otherdomain.com;
        proxy_set_header Host $1.otherdomain.com;

但遗憾的是,这最终会出现在502糟糕的网关中。 在proxy_passproxy_set_header中使用变量时没有任何效果。

我还尝试在服务器名称中使用(?<cname>.+)(?P<cname>.+),并使用$cname作为变量。

出了什么问题,为什么最终出现在502?

2 个答案:

答案 0 :(得分:6)

要在服务器名称中使用正则表达式,您需要在名称前添加代字号“〜”

server_name ~(.*).domain.com;

[<强>更新] 试了一下,它成功地将价值设定为1美元。但仍然得到502和我的nginx错误日志显示

no resolver defined to resolve xyz.otherdomain.com

即使我在/ etc / hosts文件中将该名称指向我的localhost。

找到能够很好地解释此问题的article。基本上在这种特殊情况下(上游域名中的变量),您需要使用"resolver" directive指向可以解析此动态域名的DNS服务器(例如,来自谷歌DNS服务器的8.8.8.8)。

resolver 8.8.8.8;

它在我的测试中使用公共上游域名。如果您的上游域名是本地域名,则需要为它们设置本地DNS服务器。

答案 1 :(得分:0)

使用变量的proxy_pass的服务器名称将是一种特殊情况。

proxy_pass       http://$1.otherdomain.com;
  

在这种情况下,将在描述的server groups中搜索服务器名称,如果未找到,则使用解析程序确定。

如果您不喜欢使用解析器。您可以使用下面的主机文件。

upstream www1.otherdomain.com { server 10.x.x.1; } 
upstream www2.otherdomain.com { server 10.x.x.2; }