2013-03-21 107 views
1

我正在嘗試動態設置proxy_pass目標,其中變量將是原始請求的cname。proxy_pass中的nginx變量(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?

回答

6

要在服務器名稱中使用正則表達式,你需要用一個波浪號前面加上名字「〜」

server_name ~(.*).domain.com; 

[UPDATE] 嘗試過了,它成功地設置$ 1的值。但仍獲得502和我的Nginx的錯誤日誌顯示

no resolver defined to resolve xyz.otherdomain.com 

即使我指出這個名字給我在我的/ etc/hosts文件本地主機。

找到這個很好地解釋了這個問題的article。基本上在這種特殊情況下(上游域名可變),您需要使用"resolver" directive來指向可以解析此動態域名的dns服務器(例如,來自google dns服務器的8.8.8.8)。

resolver 8.8.8.8; 

它在我的測試中使用公共上游域名進行工作。如果你的上游域名是本地的,你需要爲它們設置一個本地dns服務器。

+2

注意:如果您在proxy_pass指令中硬編碼域名,則一切正常。不需要dns解析器。在這種情況下,我猜nginx會在解析配置文件時找到這些名稱的IP地址。 – 2013-03-22 02:28:16

+0

Do not NOT **使用可公開訪問的DNS服務器,如「8.8.8.8」。 [爲防止DNS欺騙,建議在正確安全的可信任本地網絡中配置DNS服務器。](http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver) – Tim 2016-10-07 20:12:08

0

使用變量的proxy_pass的服務器名稱將是一種特殊情況。

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

在這種情況下,服務器名稱所描述的server groups中搜索,並且,如果沒有找到,使用旋轉變壓器來確定。

如果你不喜歡使用解析器。你可以使用下面的hosts文件。

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