GNU/Linux >> Linux の 問題 >  >> Linux

proxy_pass を実行するたびに、nginx に (動的ホスト名の) DNS を強制的に解決させる方法は?

解決策 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 を提供するため、パッケージがインストールされます コマンド。


Linux
  1. Nginxを使用してリダイレクトする方法

  2. nginx-413リクエストエンティティが大きすぎます

  3. NGINXでETagを無効にする方法

  1. NGINXでHTTP2を有効にする方法

  2. トラブルシューティング:ホスト名を解決できない

  3. Bashスクリプトでホスト名をIPアドレスに解決する方法は?

  1. DNSトラブルシューティング。キャンパスネットワークを使用すると、キャンパスドメインが解決しませんか?

  2. Debianでホスト名を変更する方法

  3. git push/pull を実行するときにパスワード プロンプトを無効にするにはどうすればよいですか?