Solución:
Solución 1:
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) Vuelve a compilar nginx con un módulo de terceros como el módulo perl (muy) experimental y escribe un controlador de variables:
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 gran codificador de 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.
Solucion 2:
Si está utilizando la versión Openresty de nginx, puede utilizar su especial local
argumento a la resolver
directiva que cuando se establece en local=on
, significa la ruta estándar de /etc/resolv.conf
será utilizado por el resolutor (para obtener más detalles, consulte los documentos del resolutor de Openresty):
resolver local=on;
Solución 3:
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 de
/etc/resolv.conf
e imprimirlos en una línea, para que pueda usarlos con nginx’sresolver
directiva. Su Dockerfile deberá tener un script personalizado para el punto de entrada que genera el archivo de configuración y luego inicia nginx. Digamos que tiene un archivo llamado
nginx.conf.template
que se parece a algo como:
...snip...
http {
server {
resolver $NAMESERVER valid=10s;
...snip....
}
}
}
Su secuencia de comandos de inicio puede usar el
envsubst
programa para generar unnginx.conf
y luego inicie 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 la ventana acoplable esto tiende a dar como resultado el mismo archivo, ya que, de forma predeterminada, el servidor DNS integrado de la ventana acoplable es 127.0.0.11
, consulte esta respuesta a Docker Network Nginx Resolver.