2014-11-16 11 views
10

Ho configurato il mio Nginx come semplice proxy inverso.Errore con IP e Nginx come proxy inverso

sto solo usando impostazione di base

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

Il problema è che dopo qualche tempo (pochi giorni) il sito dietro nginx diventano inaccessibili. Indead nginx prova a chiamare un cattivo IP (il sito dietro nginx è a casa mia dietro la mia scatola e io sto usando un dyn-dns perché il mio ip non è fisso). Questo dyn-dns è sempre valido (posso chiamare direttamente il mio sito) ma per oscura ragione Nginx si blocca con quello ..

Così come detto, nginx mi ha appena concesso il 504 Timeout del gateway dopo un po 'di tempo. Sembra che l'errore venga quando il mio IP cambia a casa. Ecco un esempio di log degli errori:

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

Quindi sai perché nginx sta usando IP anziché il DN?

risposta

23

Se il valore proxy_pass non contiene variabili, nginx risolverà i nomi di dominio a indirizzi IP durante il caricamento della configurazione e memorizzare nella cache loro fino a quando non si riavvia/ricaricarlo. Questo è abbastanza comprensibile dal punto di vista delle prestazioni.

Tuttavia, in caso di modifica dinamica del record DNS, questo potrebbe non essere desiderato. Quindi sono disponibili due opzioni a seconda della licenza che possiedi o meno.

versione commerciale (Nginx +)

In questo caso, utilizzare un blocco a monte e specificare il nome di dominio devono essere risolti periodicamente utilizzando un resolver specifica. Record TTL può essere annullato utilizzando il parametro valid=time. Il parametro resolve della direttiva server costringerà il DN a risolversi periodicamente.

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

    } 

} 

Questa funzione è stata aggiunta in Nginx + 1.5.12.

versione Community (Nginx)

In questo caso, si avrà anche bisogno di un sistema di risoluzione personalizzato come nella soluzione precedente. Ma per risolvere il problema della soluzione a monte non disponibile, è necessario utilizzare una variabile nella direttiva proxy_pass. In questo modo, nginx utilizzerà anche il risolutore, onorando il tempo di memorizzazione nella cache specificato con il parametro valid. Per esempio, è possibile utilizzare il nome di dominio come una variabile:

http { 

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

    server { 

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

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

    } 

} 

Quindi, è probabile che sia necessario aggiungere una direttiva proxy_redirect per gestire reindirizzamenti.

+0

Suona bene, proverò questa soluzione per dare un feedback quindi. Molte grazie. (versione per la comunità) – max54

+0

Ho provato a usare diversi resolver ma non funziona, ottengo sempre 'recv() fallito (111: Connection refused) durante la risoluzione, resolver: X.X.X.X: 53' con X come indirizzo ip differente che ho provato. – max54

+0

(modifica troppo recente) Che cosa dovrei inserire esattamente nel resolver? – max54