1

我正在尝试动态设置 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_pass在and中使用变量时没有任何效果proxy_set_header

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

出了什么问题,为什么会出现 502?

4

2 回答 2

7

要在服务器名称中使用正则表达式,您需要在名称前加上波浪号“~”

server_name ~(.*).domain.com;

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

no resolver defined to resolve xyz.otherdomain.com

即使我在 /etc/hosts 文件中将该名称指向我的本地主机。

找到这篇文章很好地解释了这个问题。基本上在这种特殊情况下(上游域名中的变量),您需要使用“解析器”指令指向可以解析此动态域名的 dns 服务器(例如,来自 google dns 服务器的 8.8.8.8)。

resolver 8.8.8.8;

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

于 2013-03-22T01:46:25.467 回答
0

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

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

在这种情况下,在描述的服务器组中搜索服务器名称,如果没有找到,则使用解析器确定。

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

upstream www1.otherdomain.com { server 10.x.x.1; } 
upstream www2.otherdomain.com { server 10.x.x.2; }
于 2015-04-08T16:00:53.237 回答