GNU/Linux >> Linux Esercitazione >  >> Linux

Come forzare nginx a risolvere il DNS (di un nome host dinamico) ogni volta che si esegue proxy_pass?

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.


Linux
  1. Come utilizzare Nginx per reindirizzare

  2. nginx - 413 Entità richiesta troppo grande

  3. Come distribuire un server DNS dinamico con Docker su Debian 10

  4. Come disabilitare ETag in NGINX

  5. Come abilitare HTTP2 in NGINX

Come abilitare TLS 1.3 in Nginx

Come trovare il nome host in Linux

Come abilitare IPv6 in Nginx?

Come installare Nginx su CentOS 7?

Come installare NGINX su Ubuntu 18.04

Come posso impostare il mio DNS quando resolv.conf viene sovrascritto?