環境変数に応じて異なるターゲットにリクエストをプロキシしようとしています。私のアプローチは、ターゲット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を使用することは本当に不可能ですか、それとも私は何か間違ったことをしていますか?
私は最近この必要性につまずき、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_pass
ingここ: http://www.nginx-discovery.com/2011/05/day-51-proxypass-and-resolver.html
編集:セキュリティのために以前のパブリックDNSをローカルDNSに置き換えました issues 。
@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
は、呼び出しを転送するホスト名である必要があります。私は運のないダッシュを含むヘッダーを使用しようとしましたが、ダッシュなしでヘッダーを使用する必要がありました。
同じ問題につまずいた
dNSサーバーに問題があることが判明するまで、proxy_passは変数を解決しませんでした
方法でこのcmdで確認できます
nslookup your-domain your-dns-ip