解決策 1:
受け入れられた回答は、nginx/1.4.2 ではうまくいきませんでした。
proxy_pass
で変数を使用する NGINX は変数を静的構成とは異なる方法で扱うため、DNS 名の再解決を強制します。 NGINX proxy_pass
から ドキュメント:
パラメータ値には変数を含めることができます。この場合、アドレスがドメイン名として指定されている場合、名前は記述されたサーバー グループの中から検索され、見つからない場合はリゾルバーを使用して決定されます。
例:
server {
...
resolver 127.0.0.1;
set $backend "http://dynamic.example.com:80";
proxy_pass $backend;
...
}
注:リゾルバー (つまり、使用するネーム サーバー) が利用可能であり、これが機能するように構成されている必要があります (および /etc/hosts
内のエントリ ファイルはルックアップで使用されません)。
デフォルトでは、NGINX キャッシュのバージョン 1.1.9 以降のバージョンは、応答の TTL 値とオプションの valid
を使用して応答します。 パラメータを使用すると、キャッシュ時間をオーバーライドできます:
resolver 127.0.0.1 [::1]:5353 valid=30s;
バージョン 1.1.9 より前では、キャッシュ時間の調整ができず、nginx は常に 5 分間回答をキャッシュしていました。 .
解決策 2:
gansbrest のコメントとオホールの回答に貴重な情報があります。
しかし、2016年に投稿されたこの公式のnginx記事に言及することが重要だと思います。この問題に関するnginxの動作と可能な解決策を明確に説明しています:https://www.nginx.com/blog/dns-service-discovery-nginx-plus /
確かに、「変数にドメイン名を設定」し、リゾルバー ディレクティブを使用する必要があります。
ただし、変数を使用すると、書き換え動作が変わります。場所と proxy_pass の設定によっては、rewrite ディレクティブを使用する必要がある場合があります。
追伸:コメントを投稿したはずですが、まだ十分なポイントがありません...
解決策 3:
それは興味深い質問であり、私の知る限りではうまくいきません。アップストリーム モジュールを使用して、フェールオーバーのディレクティブを使用して、ハッキングとして機能するかどうかを確認できます。
2018年編集:多くのことが変更されました。これに関する実際の情報を得るには、@ohaal による回答を確認してください。
解決策 4:
ohaal の回答は私たちのほとんどをそこに連れて行きますが、DNS リゾルバーが 127.0.0.1 に存在しない場合があります (たとえば、特別なコンテナー化された環境にいる場合)
その場合、nginx conf を resolver ${DNS_SERVER};
に変更することをお勧めします。 .次に、nginx を起動する前に、以下を実行してください
export DNS_SERVER=$(cat /etc/resolv.conf |grep -i '^nameserver'|head -n1|cut -d ' ' -f2)
envsubst '${DNS_SERVER}' < your_nginx.conf.template > your_nginx.conf
gettext
が必要であることに注意してください envsubst
を提供するため、パッケージがインストールされます コマンド。