2013-07-16 16 views
15

Sto provando ad includere $ remote_addr o $ http_remote_addr sul mio proxy_pass senza successo.

La regola di riscrittura funziona

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

Il proxy_pass senza il $ REMOTE_ADDR funziona, ma freegeoip non legge l'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; 
} 

Poi, sto aggiungendo l'ip di la fine della richiesta, in questo modo:

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

ma nginx rapporto di questo errore: non definito resolver di ri solve freegeoip.net

+0

L'errore si verifica quando si riavvia nginx, o quando una richiesta http colpisce il blocco di posizione? –

+0

Quando richiedo l'url –

risposta

60

Se l'istruzione proxy_pass non contiene variabili, utilizzerà la chiamata di sistema "gethostbyaddr" durante l'avvio o il ricaricamento e memorizzerà tale valore in modo permanente.

se ci sono delle variabili, come ad esempio utilizzando uno dei seguenti:

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

Poi nginx utilizzeranno un built-in resolver, e la direttiva "risolutore" deve essere presente. "resolver" è probabilmente un termine improprio; pensarlo come "quale server DNS utilizzerà il risolutore incorporato". Dal momento che nginx 1.1.9 il risolutore incorporato onorerà i valori TTL DNS. Prima di allora ha utilizzato un valore fisso di 5 minuti.

+1

Questa è una risposta molto più utile e informativa. Grazie. –

+0

Sì, questo è molto utile, grazie. – jwerre

+0

La chiave è qualsiasi variabile presente nel valore proxy_pass, grazie per la risposta e la spiegazione corrette. –

35

Sembra un po 'strano che nginx non riesca a risolvere il nome del dominio in fase di esecuzione piuttosto che in fase di configurazione (poiché il nome del dominio è hardcoded). L'aggiunta di una dichiarazione resolver al blocco di posizione di solito risolve i problemi di DNS riscontrati durante il runtime. Così il vostro blocco di posizione potrebbe essere simile:

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

Questa soluzione si basa su un articolo che ho letto un po 'indietro - Proxy pass and resolver. Varrebbe la pena leggere

+6

Do ** NOT ** utilizza un server DNS accessibile pubblicamente come '8.8.8.8'. [Per prevenire lo spoofing del DNS, si consiglia di configurare i server DNS in una rete locale attendibile correttamente protetta.] (Http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver) – Tim

+0

Questa dovrebbe essere la risposta accettata perché copre altri casi, come args, remote_addr, ecc. – onalbi

0

Si potrebbe anche menzionare il nginx server port nello proxy_pass uri. Questo ha risolto il problema per me.

0

Se qualcuno sta stll sperimentando problemi, per me è aiutato per spostare l'host proxy_pass ad un monte separato, in modo da venire con qualcosa di simile

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/; 
    } 
}