È possibile impostare l' resolver
indirizzo nella configurazione proxy nginx da /etc/resolv.conf
?
Può essere utile ad esempio nella finestra mobile o nell'ambiente virtuale.
È possibile impostare l' resolver
indirizzo nella configurazione proxy nginx da /etc/resolv.conf
?
Può essere utile ad esempio nella finestra mobile o nell'ambiente virtuale.
Risposte:
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.
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
nameserver
voci/etc/resolv.conf
e stamparle in una riga, quindi puoi usarle con laresolver
direttiva 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 chiamatonginx.conf.template
simile a:
...snip...
http {
server {
resolver $NAMESERVER valid=10s;
...snip....
}
}
}
Lo script di avvio può quindi utilizzare il
envsubst
programma per generare unnginx.conf
e 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 .
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/*.conf
nella loro configurazione predefinita. Il ricaricamento viene generalmente ignorato quando il servizio non è in esecuzione. Si noti che lo script può essere eseguito senza /usr/bin
in PATH, quindi potrebbe essere necessario il percorso assoluto di awk.
Se stai usando la versione di nginx di Openresty, allora puoi usare il loro local
argomento speciale per la resolver
direttiva che, quando impostato su local=on
, significa che /etc/resolv.conf
il risolutore verrà usato dal risolutore (per maggiori dettagli vedi i documenti del risolutore di Openresty ):
resolver local=on;
export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf)
. Non c'è bisogno dicat
,grep
otr
in là.