Dirección de resolución de Nginx de /etc/resolv.conf


18

¿Es posible establecer la resolverdirección en la configuración del proxy nginx desde /etc/resolv.conf?

Puede ser útil, por ejemplo, en docker o en virtualenvironment.

Respuestas:


16

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.


6

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 nameserverentradas /etc/resolv.confe imprimirlas en una línea, para que pueda usarlas con la resolverdirectiva 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 llamado nginx.conf.templateque se parece a:

...snip...
http {
  server {

    resolver $NAMESERVER valid=10s;

    ...snip....  
    }
  }
}

Su script de inicio puede usar el envsubstprograma para generar un nginx.confy 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 .


2
Awk, aprender, que es una herramienta fantástica para munging texto: export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf). No es necesario cat, grepni trallí.
j0057

Sin embargo, esto no funciona en Kubernetes.
Kim

1

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/*.confen su configuración predeterminada. La recarga generalmente se ignora cuando el servicio no se está ejecutando. Observe que el script puede ejecutarse sin /usr/binen PATH, por lo que puede necesitar una ruta absoluta a awk.


1

Si está utilizando la versión Openresty de nginx, puede usar su localargumento especial para la resolverdirectiva que, cuando se establece en local=on, significa que la ruta estándar de /etc/resolv.confserá utilizada por el resolutor (para más detalles, consulte los documentos del resolutor Openresty ):

resolver local=on;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.