web-dev-qa-db-ja.com

リバースプロキシとしてのIPとNginxのエラー

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を使用している理由を知っていますか?

16
max54

proxy_pass値に変数が含まれていない場合、nginxは構成の読み込み中にドメイン名をIPに解決し、再起動/再読み込みするまでそれらをキャッシュします。これは、パフォーマンスの観点からは非常に理解できます。

ただし、動的DNSレコードの変更の場合、これは望ましくない場合があります。したがって、所有しているかどうかに応じて、2つのオプションを使用できます。

商用バージョン(Nginx +)

この場合、アップストリームブロックを使用し、特定のリゾルバーを使用して定期的に解決する必要があるドメイン名を指定します。レコード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で追加されました。

コミュニティバージョン(Nginx)

その場合、前のソリューションと同様にカスタムリゾルバーも必要になります。ただし、使用できないアップストリームソリューションを回避するには、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ディレクティブを追加する必要があります。

30
Xavier Lucas

多分これをチェックしてください 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.
4
DOA