web-dev-qa-db-ja.com

nginx 1.0で$ varへの動的proxy_pass

環境変数に応じて異なるターゲットにリクエストをプロキシしようとしています。私のアプローチは、ターゲットURLをカスタム変数$ targetに入れ、これをproxy_passに渡すことでした。

ただし、proxy_passで変数を使用しても機能しないようです。この単純な設定により、nginxから「502 Bad Gateway」応答が返されます。

server {
  listen   8080;
  server_name  myhost.example.com;
  access_log  /var/log/nginx/myhost.access.log;
  location /proxy {
    set $target http://proxytarget.example.com;
    proxy_pass $target;
  }
}

変数なしの同じ設定が機能します:

server {
  listen   8080;
  server_name  myhost.example.com;
  access_log  /var/log/nginx/myhost.access.log;
  location /proxy {
    proxy_pass http://proxytarget.example.com;
  }
}

この方法でproxy_passを使用することは本当に不可能ですか、それとも私は何か間違ったことをしていますか?

34
Sebastian Heuer

私は最近この必要性につまずき、proxy_pass宛先で変数を使用するためには、error.logにno resolver defined to resolve ...

私の場合の解決策は、DNS解決にGoogleを使用して以下をセットアップすることでした。

location ~ /proxy/(.*) {
    resolver 127.0.0.1 [::1];
    proxy_pass http://$1;
}

あなたの場合、これはうまくいくはずです:

location /proxy {
    resolver 127.0.0.1 [::1];
    set $target http://proxytarget.example.com;
    proxy_pass $target;
}

リゾルバ127.0.0.1が機能するには、bind9をローカルにインストールする必要があります。 Debian/Ubuntuの場合:

Sudo apt-get install bind9

Nginxおよび動的proxy_passingここ: http://www.nginx-discovery.com/2011/05/day-51-proxypass-and-resolver.html

編集:セキュリティのために以前のパブリックDNSをローカルDNSに置き換えました issues

62
soulseekah

@soulseekahの回答は完全かつ正確ですが、KubernetesまたはDocker Compose内のコンテナーのクラスター内でNginxを使用しているユーザーに回答を投稿したいと思います。

基本的に、実際のDNSリゾルバーのアドレスでNginxのリゾルバーを設定する必要があります。 Dockerの場合は always at 127.0.0.11です。Kubernetesの場合は this answer を参照してください。

Dockerネットワーク内で、動的proxy_passを正常に構成できました。

resolver 127.0.0.11 [::1];
set $bcknd http://$http_XBackend$uri$is_args$args;
proxy_pass        $bcknd;

基本的だった$uri$is_args$argsを追加することに注意してください。そうでない場合、プロキシパスはパスとクエリ文字列を考慮しませんでした。

PS:私の例では、$http_XBackend変数を使用してヘッダーを読み取っています。ヘッダーは、クライアントによってXBackend: Hostとして渡されます。ここで、Hostは、呼び出しを転送するホスト名である必要があります。私は運のないダッシュを含むヘッダーを使用しようとしましたが、ダッシュなしでヘッダーを使用する必要がありました。

9
Naramsim

同じ問題につまずいた

dNSサーバーに問題があることが判明するまで、proxy_passは変数を解決しませんでした

方法でこのcmdで確認できます

nslookup your-domain your-dns-ip
0
user3400341