2014-11-16 8 views
10

Ich konfigurierte meine Nginx als einfache Reverse-Proxy.Fehler mit IP und Nginx als Reverse-Proxy

Ich bin nur Grundeinstellung

location/{ 
    proxy_pass foo.dnsalias.net; 
    proxy_pass_header Set-Cookie; 
    proxy_pass_header P3P; 
} 

Das Problem ist, mit, dass nach einiger Zeit (wenige Tage) die Seite hinter nginx unaccessible werden. Indead nginx versuchen, eine schlechte ip (die Seite hinter nginx ist bei mir zu Hause hinter meiner Box und ich bin eine Verwendung einer Dyn-DNS, weil meine IP nicht fix ist). Diese dyn-dns ist immer gültig (ich kann meine Seite direkt aufrufen), aber aus unbekannten Gründen bleibt Nginx dabei stecken.

Also wie gesagt, nginx gib mir einfach 504 Gateway Timeout nach einiger Zeit. Es sieht so aus als käme der Fehler, wenn sich meine IP zu Hause ändert. Hier ist ein Beispiel für Fehlerprotokoll:

[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" 

So wissen Sie, warum nginx ip verwendet, wird anstelle des DN?

Antwort

23

heraus überprüfen Wenn die proxy_pass Wertvariablen nicht enthalten, wird nginx Domain-Namen zu IP-Adressen aufzulösen, während der Konfiguration zu laden und sie zwischenspeichern, bis Sie/neu starten, es neu zu laden. Dies ist unter dem Gesichtspunkt der Leistung ziemlich verständlich.

Im Falle einer dynamischen DNS-Datensatzänderung ist dies jedoch möglicherweise nicht erwünscht. Je nachdem, welche Lizenz Sie besitzen oder nicht, stehen Ihnen zwei Optionen zur Verfügung.

Kommerzielle Version (Nginx +)

In diesem Fall einen vorgeschalteten Block verwenden und die Domänennamen angeben müssen regelmäßig gelöst werden, um einen bestimmten Resolver. Records TTL kann über den Parameter valid=time überschrieben werden. Der resolve-Parameter der server-Anweisung erzwingt die regelmäßige Auflösung des 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; 
      ... 
     } 

    } 

} 

Diese Funktion wurde in Nginx + 1.5.12 hinzugefügt.

Gemeinschafts Version (Nginx)

In diesem Fall müssen Sie auch einen benutzerdefinierten Resolver als in der vorherigen Lösung. Um jedoch die nicht verfügbare Upstream-Lösung zu umgehen, müssen Sie eine Variable in Ihrer proxy_pass Direktive verwenden. Auf diese Weise verwendet nginx auch den Resolver, wobei die mit dem Parameter valid angegebene Caching-Zeit berücksichtigt wird. Zum Beispiel können Sie die Domainnamen als Variable verwenden:

http { 

    resolver X.X.X.X valid=5s; 

    server { 

     server_name www.example.com; 
     set $dn "foo.dnsalias.net"; 

     location/{ 
      proxy_pass http://$dn; 
      ... 
     } 

    } 

} 

Dann werden Sie wahrscheinlich eine proxy_redirect Richtlinie behandeln Umleitungen hinzufügen müssen.

+0

Hört sich gut an, ich werde diese Lösung versuchen und Feedback geben. Danke vielmals. (Community-Version) – max54

+0

Ich habe versucht, mehrere Resolver zu verwenden, aber nichts funktioniert, ich bekomme immer 'recv() fehlgeschlagen (111: Verbindung abgelehnt) beim Auflösen, Resolver: X.X.X.X: 53' mit X als andere IP-Adresse Ich habe versucht. – max54

+0

(zu spät bearbeiten) Was genau sollte ich in Resolver setzen? – max54