1

変数が元のリクエストのcnameになるproxy_pass宛先を動的に設定しようとしています。

私が今持っているのは:

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になるのですか?

4

2 に答える 2

7

サーバー名で正規表現を使用するには、名前の前にチルダ「〜」を付ける必要があります

server_name ~(.*).domain.com;

[ UPDATE ]試してみたところ、$1の値が正常に設定されました。しかし、それでも502を取得すると、nginxエラーログに次のように表示されます

no resolver defined to resolve xyz.otherdomain.com

その名前を/etc/hostsファイルのローカルホストにポイントしていても。

この問題をよく説明しているこの記事を見つけてください。基本的に、この特殊なケース(アップストリームドメイン名の変数)では、「resolver」ディレクティブを使用して、この動的ドメイン名を解決できる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;

この場合、サーバー名は記述されたサーバーグループの中から検索され、見つからない場合はリゾルバーを使用して決定されます。

リゾルバーを使用したくない場合。以下のhostsファイルのように使用できます。

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