2013-07-16 5 views
15

Ich versuche $ remote_addr oder $ http_remote_addr auf meinem proxy_pass ohne Erfolg aufzunehmen.

Die Rewrite-Regel arbeitet

location ^~ /freegeoip/ { 
    rewrite^http://freegeoip.net/json/$remote_addr last; 
} 

Die proxy_pass ohne das $ remote_addr funktioniert, aber freegeoip liest nicht die x-Real-IP

location ^~ /freegeoip/ { 
    proxy_pass http://freegeoip.net/json/; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $host; 
} 

Dann ich hinzufüge, die ip das Ende der Anfrage, wie folgt:

location ^~ /freegeoip/ { 
    proxy_pass http://freegeoip.net/json/$remote_addr; 
} 

aber Nginx melden diesen Fehler: kein Resolver zu re definiert lösen freegeoip.net

+0

tritt der Fehler auf, wenn Sie nginx neu zu starten, oder wenn eine http-Anfrage den Standortblock erreicht? –

+0

Wenn ich die URL –

Antwort

60

Wenn die proxy_pass-Anweisung keine Variablen enthält, verwendet sie den Systemaufruf "gethostbyaddr" während des Starts oder Neuladens und speichert diesen Wert permanent zwischen.

, ob es irgendwelche Variablen, wie zum Beispiel eine der folgenden verwendet:

set $originaddr http://origin.example.com; 
proxy_pass $originaddr; 
# or even 
proxy_pass http://origin.example.com$request_uri; 

Dann nginx wird über einen integrierten Resolver verwenden, und die „Resolver“ Richtlinie muss vorhanden sein. "Resolver" ist wahrscheinlich eine falsche Bezeichnung; Betrachten Sie es als "welchen DNS-Server der integrierte Resolver verwendet". Seit nginx 1.1.9 berücksichtigt der integrierte Resolver DNS-TTL-Werte. Vorher wurde ein fester Wert von 5 Minuten verwendet.

+1

Dies ist eine _much_ nützlichere und informativere Antwort. Vielen Dank. –

+0

Ja, das ist sehr nützlich, danke. – jwerre

+0

Der Schlüssel ist jede Variable, die im Wert von proxy_pass vorhanden ist, danke für die richtige Antwort und Erklärung. –

35

Es scheint ein bisschen seltsam, dass nginx den Domänennamen zur Laufzeit statt zur Konfigurationszeit auflösen kann (da der Domänenname fest codiert ist). Das Hinzufügen einer resolver Deklaration zum Standortblock behebt normalerweise DNS-Probleme, die zur Laufzeit auftreten. Also Ihr Standort Block könnte wie folgt aussehen:

location ^~ /freegeoip/ { 
    #use google as dns 
    resolver 8.8.8.8; 
    proxy_pass http://freegeoip.net/json/$remote_addr; 
} 

Diese Lösung auf einen Artikel basiert ich eine Weile zurück gelesen - Proxy pass and resolver. Wäre es wert, gelesen zu werden.

+6

anfordere, verwende ** ** NICHT einen öffentlich zugänglichen DNS-Server wie '8.8.8.8'. [Um DNS-Spoofing zu verhindern, wird empfohlen, DNS-Server in einem ordnungsgemäß gesicherten vertrauenswürdigen lokalen Netzwerk zu konfigurieren.] (Http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver) – Tim

+0

Dies sollte die akzeptierte Antwort sein, weil es deckt andere Fälle ab, wie args, remote_addr, usw. – onalbi

0

Sie könnten auch Ihre Nginx in der proxy_pass uri erwähnen. Das hat das Problem für mich gelöst.

0

Wenn jemand stll Schwierigkeiten erfährt, mir half es die proxy_pass Gastgeber für eine separate stromaufwärts zu bewegen, so dass ich komme mit so etwas wie diese

upstream backend-server { 
    server backend.service.consul; 
} 

server { 
    listen  80; 
    server_name frontend.test.me; 

    location ~/api(.*)$ { 
    proxy_pass http://backend-server$1; 
    } 
    location/{ 
    # this works mystically! backend doesn't... 
    proxy_pass http://frontend.service.consul/; 
    } 
}