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.
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.
Réponses:
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.
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 laresolverdirective 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 unnginx.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 .
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.
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;
export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf). Pas besoincat,grepnitrlà-dedans.