Nginxを単純なリバースプロキシとして構成しました。
基本設定を使用しているだけです
location / {
proxy_pass foo.dnsalias.net;
proxy_pass_header Set-Cookie;
proxy_pass_header P3P;
}
問題は、しばらくすると(数日)、nginxの背後にあるサイトにアクセスできなくなることです。 Indead nginxは不正なIPを呼び出そうとします(nginxの背後にあるサイトは私のボックスの背後にある私の家にあり、私のIPは修正されていないため、dyn-dnsを使用しています)。このdyn-dnsは常に有効です(自分のサイトを直接呼び出すことができます)が、あいまいな理由でNginxはそれに固執します。
つまり、前述のように、nginxはしばらくすると504ゲートウェイタイムアウトが発生します。自宅でIPを変更するとエラーが発生するようです。エラーログのサンプルは次のとおりです。
[error] ... upstream timed out (110: Connection timed out) while connecting to upstream, client: my.current.ip, server: myreverse.server.com, request: "GET /favicon.ico HTTP/1.1", upstream: "http://my.old
.home.ip", Host: "myreverse.server.com"
では、nginxがDNの代わりにipを使用している理由を知っていますか?
proxy_pass
値に変数が含まれていない場合、nginxは構成の読み込み中にドメイン名をIPに解決し、再起動/再読み込みするまでそれらをキャッシュします。これは、パフォーマンスの観点からは非常に理解できます。
ただし、動的DNSレコードの変更の場合、これは望ましくない場合があります。したがって、所有しているかどうかに応じて、2つのオプションを使用できます。
この場合、アップストリームブロックを使用し、特定のリゾルバーを使用して定期的に解決する必要があるドメイン名を指定します。レコードTTLは、valid=time
パラメーターを使用してオーバーライドできます。resolve
ディレクティブのserver
パラメーターは、DNを定期的に解決するように強制します。
http {
resolver X.X.X.X valid=5s;
upstream dynamic {
server foo.dnsalias.net resolve;
}
server {
server_name www.example.com;
location / {
proxy_pass http://dynamic;
...
}
}
}
この機能はNginx + 1.5.12で追加されました。
その場合、前のソリューションと同様にカスタムリゾルバーも必要になります。ただし、使用できないアップストリームソリューションを回避するには、proxy_pass
ディレクティブで変数を使用する必要があります。そうすれば、nginxはリゾルバーも使用し、valid
パラメーターで指定されたキャッシュ時間を尊重します。たとえば、ドメイン名を変数として使用できます。
http {
resolver X.X.X.X valid=5s;
server {
server_name www.example.com;
set $dn "foo.dnsalias.net";
location / {
proxy_pass http://$dn;
...
}
}
}
次に、リダイレクトを処理するためにproxy_redirect
ディレクティブを追加する必要があります。
多分これをチェックしてください http://forum.nginx.org/read.php?2,215830,215832#msg-215832
resolver 127.0.0.1;
set $backend "foo.example.com";
proxy_pass http://$backend;
In such setup ip address of "foo.example.com" will be looked up
dynamically and result will be cached for 5 minutes.