我正在尝试动态设置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
和proxy_set_header
中使用变量时没有任何效果。
我还尝试在服务器名称中使用(?<cname>.+)
或(?P<cname>.+)
,并使用$cname
作为变量。
出了什么问题,为什么最终出现在502?
答案 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; }