Adresse du résolveur Nginx de /etc/resolv.conf

18

Est-il possible de définir l' resolveradresse dans la configuration du proxy nginx à partir de /etc/resolv.conf?

Il peut être utile par exemple dans docker ou dans l'environnement virtuel.

Nikolai Golub
la source

Réponses:

16

Malheureusement, il n'y a pas de moyen facile de le faire car nginx utilise sa propre implémentation de résolveur. Les deux solutions que je vois sont:

1) Vous générez la liste des résolveurs à partir d'un script et l'incluez, par exemple:

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

http {

    include resolvers.conf;

}

2) Vous recompilez nginx avec un module tiers comme le module perl (très) expérimental et écrivez un gestionnaire de variables:

http {

    perl_modules perl/lib;
    perl_set $resolvers '

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

    resolver "$resolvers";
}

Maintenant, si vous êtes un enfer d'un codeur C (préparez vos yeux pour du sang), vous pouvez toujours écrire un patch ou un module alternatif pour le faire fonctionner de cette façon.

Xavier Lucas
la source
6

Pour les utilisateurs Docker, la solution trouvée ici :

Voici une solution de contournement pour les personnes utilisant Docker.

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

Cela permet de prendre toutes les nameserverentrées /etc/resolv.confet de les imprimer sur une ligne, afin que vous puissiez les utiliser avec la resolverdirective nginx . Votre Dockerfile devra avoir un script personnalisé pour le point d'entrée qui génère le fichier de configuration, puis démarre nginx. Disons que vous avez un fichier appelé nginx.conf.templatequi ressemble à quelque chose comme:

...snip...
http {
  server {

    resolver $NAMESERVER valid=10s;

    ...snip....  
    }
  }
}

Votre script de démarrage peut ensuite utiliser le envsubstprogramme pour générer un nginx.conf, puis démarrer nginx. par exemple:

#!/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;"

REMARQUE: dans Docker, cela a tendance à entraîner le même fichier, car par défaut le serveur DNS intégré Docker est 127.0.0.11, consultez cette réponse à Docker Network Nginx Resolver .

FelikZ
la source
2
Awk, apprendre, c'est un outil fantastique pour le texte munging: export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf). Pas besoin cat, grepni trlà-dedans.
j0057
cela ne fonctionne pas sur Kubernetes.
Kim
1

Si votre système utilise resolvconf (comme le font de nombreuses machines virtuelles, mais malheureusement Docker ne le fait pas, voir man 8 resolvconf), vous pouvez créer le nginx resolvers.conf(comme dans l'autre réponse) dans /etc/resolvconf/update-libc.d/nginx. Cela se comporte bien, même dans les rares cas de changement dynamique de résolveurs.

#!/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

Certaines distributions Linux incluent /etc/nginx/conf.d/*.confdans leur configuration par défaut. Le rechargement est généralement ignoré lorsque le service n'est pas en cours d'exécution. Notez que le script peut être exécuté sans /usr/bindans PATH, vous aurez donc peut-être besoin d'un chemin absolu vers awk.

Marko Kohtala
la source
1

Si vous utilisez la version Openresty de nginx, vous pouvez utiliser leur localargument spécial à la resolverdirective qui, lorsqu'elle est définie sur local=on, signifie que le chemin standard de /etc/resolv.confsera utilisé par le résolveur (pour plus de détails, voir la documentation du résolveur Openresty ):

resolver local=on;
Pierz
la source