Indirizzo del resolver Nginx da /etc/resolv.conf


18

È possibile impostare l' resolverindirizzo nella configurazione proxy nginx da /etc/resolv.conf?

Può essere utile ad esempio nella finestra mobile o nell'ambiente virtuale.

Risposte:


16

Sfortunatamente non esiste un modo semplice per farlo perché nginx usa la propria implementazione del resolver. Le due soluzioni che vedo sono:

1) Generare l'elenco dei risolutori da uno script e includerlo, ad esempio:

echo resolver $(awk 'BEGIN{ORS=" "} $1=="nameserver" {print $2}' /etc/resolv.conf) ";" > /etc/nginx/resolvers.conf

http {

    include resolvers.conf;

}

2) Ricompila nginx con un modulo di terze parti come il modulo (molto) sperimentale perl e scrivi un gestore di variabili:

http {

    perl_modules perl/lib;
    perl_set $resolvers '

        sub {
            return system("awk BEGIN{ORS=\" \"} /nameserver/{print \$2}" /etc/resolv.conf");
        };

    resolver "$resolvers";
}

Ora, se sei un programmatore infernale di C (prepara gli occhi per un po 'di sangue), puoi ancora scrivere una patch o un modulo alternativo per farlo funzionare in questo modo.


6

Per gli utenti Docker, la soluzione si trova qui :

Ecco una soluzione alternativa per le persone che utilizzano Docker.

export NAMESERVER=`cat /etc/resolv.conf | grep "nameserver" | awk '{print $2}' | tr '\n' ' '`

Ciò che fa è prendere tutte le nameservervoci /etc/resolv.confe stamparle in una riga, quindi puoi usarle con la resolverdirettiva di nginx . Il Dockerfile dovrà avere uno script personalizzato per il punto di accesso che genera il file di configurazione e quindi avvia nginx. Supponiamo che tu abbia un file chiamato nginx.conf.templatesimile a:

...snip...
http {
  server {

    resolver $NAMESERVER valid=10s;

    ...snip....  
    }
  }
}

Lo script di avvio può quindi utilizzare il envsubstprogramma per generare un nginx.confe quindi avviare nginx. per esempio:

#!/bin/bash
if [ "$NAMESERVER" == "" ]; then
    export NAMESERVER=`cat /etc/resolv.conf | grep "nameserver" | awk '{print $2}' | tr '\n' ' '`
fi

echo "Nameserver is: $NAMESERVER"

echo "Copying nginx config"
envsubst '$NAMESERVER' < /nginx.conf.template > /nginx.conf

echo "Using nginx config:"
cat /nginx.conf

echo "Starting nginx"
nginx -c /nginx.conf -g "daemon off;"

NOTA che nella finestra mobile ciò tende a generare lo stesso file, come per impostazione predefinita è il server DNS incorporato nella finestra mobile 127.0.0.11, vedere questa risposta a Docker Network Nginx Resolver .


2
Awk, imparare esso, è uno strumento fantastico per munging il testo: export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf). Non c'è bisogno di cat, grepo trin là.
j0057,

questo non funziona su Kubernetes però.
Kim,

1

Se il tuo sistema utilizza resolvconf (come fanno molte macchine virtuali, ma sfortunatamente Docker no, vedi man 8 resolvconf), potresti creare nginx resolvers.conf(come nell'altra risposta) in /etc/resolvconf/update-libc.d/nginx. Questo si comporta bene anche nel raro caso di cambiamento dinamico dei resolver.

#!/bin/sh
conf="resolver $(/usr/bin/awk 'BEGIN{ORS=" "} $1=="nameserver" {print $2}' /etc/resolv.conf);"
[ "$conf" = "resolver ;" ] && exit 0
confpath=/etc/nginx/conf.d/resolvers.conf
if [ ! -e $confpath ] || [ "$conf" != "$(cat $confpath)" ]
then
    echo "$conf" > $confpath
    service nginx reload >/dev/null
fi
exit 0

Alcune distribuzioni di Linux includono /etc/nginx/conf.d/*.confnella loro configurazione predefinita. Il ricaricamento viene generalmente ignorato quando il servizio non è in esecuzione. Si noti che lo script può essere eseguito senza /usr/binin PATH, quindi potrebbe essere necessario il percorso assoluto di awk.


1

Se stai usando la versione di nginx di Openresty, allora puoi usare il loro localargomento speciale per la resolverdirettiva che, quando impostato su local=on, significa che /etc/resolv.confil risolutore verrà usato dal risolutore (per maggiori dettagli vedi i documenti del risolutore di Openresty ):

resolver local=on;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.