Soluzione 1:
La risposta accettata non ha funzionato per me su nginx/1.4.2.
Utilizzo di una variabile in proxy_pass
forza la ri-risoluzione dei nomi DNS perché NGINX tratta le variabili in modo diverso rispetto alla configurazione statica. Da NGINX proxy_pass
documentazione:
Il valore del parametro può contenere variabili. In questo caso, se viene specificato un indirizzo come nome di dominio, il nome viene cercato tra i gruppi di server descritti e, se non viene trovato, viene determinato utilizzando un resolver.
Ad esempio:
server {
...
resolver 127.0.0.1;
set $backend "http://dynamic.example.com:80";
proxy_pass $backend;
...
}
Nota:un resolver (ovvero il server dei nomi da utilizzare) DEVE essere disponibile e configurato affinché funzioni (e le voci all'interno di un /etc/hosts
file non verrà utilizzato in una ricerca).
Per impostazione predefinita, la versione 1.1.9 o successive di NGINX memorizza nella cache le risposte utilizzando il valore TTL di una risposta e un valid
facoltativo parametro consente di sovrascrivere il tempo della cache:
resolver 127.0.0.1 [::1]:5353 valid=30s;
Prima della versione 1.1.9, l'ottimizzazione del tempo di memorizzazione nella cache non era possibile e nginx memorizzava sempre nella cache le risposte per la durata di 5 minuti. .
Soluzione 2:
Ci sono informazioni preziose nel commento di gansbrest e nella risposta di ohaal.
Ma penso sia importante menzionare questo articolo ufficiale di nginx, pubblicato nel 2016, che spiega chiaramente il comportamento di nginx su questo argomento e le possibili soluzioni:https://www.nginx.com/blog/dns-service-discovery-nginx-plus /
Dobbiamo infatti "impostare il nome di dominio in una variabile" e utilizzare la direttiva resolver.
tuttavia, l'utilizzo di una variabile modifica il comportamento di riscrittura. Potrebbe essere necessario utilizzare la direttiva rewrite, dipende dalla tua posizione e dall'impostazione proxy_pass.
PS:avrei postato un commento ma non ho ancora abbastanza punti...
Soluzione 3:
È una domanda intrigante e AFAIK che non funzionerà bene. Puoi provare a utilizzare il modulo upstream e utilizzare le direttive per il failover per vedere se funziona come hack.
Modifica 2018:molte cose sono cambiate. Controlla la risposta di @ohaal per ottenere informazioni reali al riguardo.
Soluzione 4:
la risposta di ohaal porta la maggior parte di noi lì, ma c'è un caso in cui il resolver DNS non vive a 127.0.0.1 (ad esempio quando ci si trova in uno speciale ambiente containerizzato)
In tal caso, potresti voler modificare nginx conf in resolver ${DNS_SERVER};
. Quindi, prima di avviare nginx, esegui
export DNS_SERVER=$(cat /etc/resolv.conf |grep -i '^nameserver'|head -n1|cut -d ' ' -f2)
envsubst '${DNS_SERVER}' < your_nginx.conf.template > your_nginx.conf
Nota che hai bisogno del gettext
pacchetto installato, in quanto fornisce il envsubst
comando.