2015-10-19 8 views
6

一致するパスプレフィックスを削除している間にproxy_passを使用して別のサーバにリクエストをプロキシしたいとします。私はこれを行う一つの方法は次の通りだと信じています。NGINX proxy_passパスプレフィックスを削除してDNSを解決する

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

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

NGINXの非商用バージョンでこの問題が認識される限り、website.comのDNS Aレコードは起動時に永久にロードされ、キャッシュされます。私は、proxy_passディレクティブに$request_uriのような変数を使用することでこれを回避するテクニックを見てきました。このため、NGINXはレコードのTTLに従ってDNSを再解決しなければなりません。

など。

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

残念ながら、まだ上流に/ A /プレフィックスを渡すように見えるとして上記動作しないようです。

私がここで達成したいのは、DNSレコードが永遠にキャッシュされないように、パスプレフィックスを削除しながら要求をプロキシすることです。

ありがとうございました。

答えて

11

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

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

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

(そうでない場合は、ホスティングプロバイダのDNSの余分な待ち時間とダウンタイムがすぐにあなたのサイトに影響を与えるだろう、確かにドメイン名をキャッシュしないように実装だ場合、あなたにも地元のリゾルバを実行したい場合があります、そのサーバの可能なDNSクエリの制限は言うまでもありません。)


おそらく、より良い解決策は、定期的に自動的にDNSに変更をピックアップするのnginxを再起動するでしょうか?たとえば、nginx -s reloadまたはkill -HUPhttp://nginx.org/en/docs/beginners_guide.html#controlhttp://nginx.org/en/docs/control.html#reconfigurationで説明されているように、nginxはリロード中のリクエストの処理を止めることはないので、安全な操作でなければなりません。また、DNSがフラッシュされる可能性が最も高くなります。

+0

あなたの返事をありがとう、私は今日これをテストし、それがうまくいけば、私はこの答えを受け入れてマークします。以前のアドバイス[ここ](http://gc-taylor.com/blog/2011/11/10/nginx-aws-elb-name-resolution-resolvers)が見つかりました。以前はこれがなくても、アップストリームは数日おきに確実に利用できなくなり、再起動する必要があるため、DNSの解決に至るまで、これに「意図した」効果があったと確信しています。私はこれを3ヶ月以上にわたって実行していましたが、再起動はしませんでした。その変更を行って以来、DNSに関する問題は発生していません。 –

+0

ああ、もしnginxがproxy_pass内の変数の存在下で解決したすべてのホスト名の5分間キャッシュを保持していれば意味があります。それは実際にはそのように文書化されていますが、それほど明白ではありません!毎日学ぶ! :-)そうすれば、上記がうまくいくはずです。また、 '.com'の後に'/'を取り除くべきです。例えば、' 'でなければなりません。com $ uri' – cnst

+0

予備テストはあなたのオリジナルの提案 'rewrite ^/a /(.*)/ $ 1 breakでうまくいくようです。 proxy_pass https://website.com/$uri$is_args$args;) '.com $ uri'ではOKではありません。(クエリパラメータは上流に伝播されません。最初の提案に固執します。ありがとう –