web-dev-qa-db-ja.com

NGINX proxy_passパスプレフィックスを削除し、DNSを解決します

一致したパスプレフィックスを削除しながら、proxy_passを使用して別のサーバーにリクエストをプロキシしたいと思います。これを行う1つの方法は次のとおりだと思います。

location /a/ {
  proxy_pass https://website.com/
}

例えば。 http://localhost/a/b.htmlへのリクエストはhttps://website.com/b.htmlにプロキシされます。

NGINXの非商用バージョンでのこれに関する問題を私が知っている限り、website.comのDNSAレコードは、起動時に永久にロードおよびキャッシュされるということです。これを回避するには、proxy_passディレクティブで$request_uriなどの変数を使用し、NGINXがレコードのTTL=に従ってDNSを解決するように強制します。 。

例えば。

location /a/ {
  rewrite ^/a/(.*) /$1  break;
  proxy_pass https://website.com/$request_uri
}

残念ながら、/ a /接頭辞を上流に渡しているように見えるため、上記は機能しないようです。

基本的に、ここで達成したいのは、DNSレコードが永久にキャッシュされないように、パスプレフィックスを削除しながらリクエストをプロキシすることです。

ありがとう。

9
David

どこで見たのかはわかりませんが、$request_uriを具体的に使用しても、nginxが魔法のようにドメイン名を動的に解決することはありません。

おそらく、変数が使用されているときにドメイン名がキャッシュなしで毎回個別に解決されるという前提で、$uri(別の変数)などの変数を明示的に使用することが提案されましたか?私はそのような仮定が正しいかどうかを確認または否定しませんが、以下は少なくともあなたのために/aを取り除きます。

location /a/ {
  rewrite ^/a/(.*) /$1  break;
  proxy_pass https://website.com/$uri$is_args$args;
}

(ドメイン名をキャッシュしないように実際に実装されている場合は、ローカルリゾルバーを実行することをお勧めします。そうしないと、ホスティングプロバイダーのDNSの余分な遅延とダウンタイムが、DNSの可能性は言うまでもなく、すぐにサイトに影響します。サーバーのクエリ制限。)


おそらく、より良い解決策は、定期的にnginxを再起動して、DNSの変更を自動的に取得することです。例:nginx -s reloadまたは kill -HUPhttp://nginx.org/en/docs/beginners_guide.html#control および httpで説明されているように: //nginx.org/en/docs/control.html#reconfiguration 、nginxはリロード中にリクエストの処理を停止しないため、安全な操作である必要があります。また、DNSもフラッシュされる可能性が高くなります。

23
cnst