¿Es posible establecer la resolver
dirección en la configuración del proxy nginx desde /etc/resolv.conf
?
Puede ser útil, por ejemplo, en docker o en virtualenvironment.
¿Es posible establecer la resolver
dirección en la configuración del proxy nginx desde /etc/resolv.conf
?
Puede ser útil, por ejemplo, en docker o en virtualenvironment.
Respuestas:
Desafortunadamente, no hay una manera fácil de hacer esto porque nginx usa su propia implementación de resolución. Las dos soluciones que veo son:
1) Genera la lista de resolución de un script y la incluye, por ejemplo:
echo resolver $(awk 'BEGIN{ORS=" "} $1=="nameserver" {print $2}' /etc/resolv.conf) ";" > /etc/nginx/resolvers.conf
http {
include resolvers.conf;
}
2) Recompila nginx con un módulo de terceros como el módulo perl (muy) experimental y escribe un controlador variable:
http {
perl_modules perl/lib;
perl_set $resolvers '
sub {
return system("awk BEGIN{ORS=\" \"} /nameserver/{print \$2}" /etc/resolv.conf");
};
resolver "$resolvers";
}
Ahora, si eres un codificador C (prepara tus ojos para un poco de sangre), aún puedes escribir un parche o módulo alternativo para que funcione de esta manera.
Para los usuarios de Docker, la solución se encuentra aquí :
Aquí hay una solución para las personas que usan Docker.
export NAMESERVER=`cat /etc/resolv.conf | grep "nameserver" | awk '{print $2}' | tr '\n' ' '`
Lo que esto hace es tomar todas las
nameserver
entradas/etc/resolv.conf
e imprimirlas en una línea, para que pueda usarlas con laresolver
directiva nginx . Su Dockerfile necesitará tener un script personalizado para el punto de entrada que genere el archivo de configuración y luego inicie nginx. Digamos que tiene un archivo llamadonginx.conf.template
que se parece a:
...snip...
http {
server {
resolver $NAMESERVER valid=10s;
...snip....
}
}
}
Su script de inicio puede usar el
envsubst
programa para generar unnginx.conf
y luego iniciar nginx. p.ej:
#!/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;"
TENGA EN CUENTA que en Docker esto tiende a dar como resultado el mismo archivo, ya que, de manera predeterminada, el servidor DNS incorporado de Docker es 127.0.0.11
, vea esta respuesta a Docker Network Nginx Resolver .
Si su sistema usa resolvconf (como lo hacen muchas máquinas virtuales, pero desafortunadamente Docker no lo hace, vea man 8 resolvconf
), puede crear el nginx resolvers.conf
(como en la otra respuesta) en /etc/resolvconf/update-libc.d/nginx
. Esto se comporta bien incluso en el raro caso de cambio dinámico de resolvers.
#!/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
Algunas distribuciones de Linux se incluyen /etc/nginx/conf.d/*.conf
en su configuración predeterminada. La recarga generalmente se ignora cuando el servicio no se está ejecutando. Observe que el script puede ejecutarse sin /usr/bin
en PATH, por lo que puede necesitar una ruta absoluta a awk.
Si está utilizando la versión Openresty de nginx, puede usar su local
argumento especial para la resolver
directiva que, cuando se establece en local=on
, significa que la ruta estándar de /etc/resolv.conf
será utilizada por el resolutor (para más detalles, consulte los documentos del resolutor Openresty ):
resolver local=on;
export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf)
. No es necesariocat
,grep
nitr
allí.