Est-il possible de définir l' resolver
adresse 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' resolver
adresse 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
nameserver
entrées/etc/resolv.conf
et de les imprimer sur une ligne, afin que vous puissiez les utiliser avec laresolver
directive 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.template
qui ressemble à quelque chose comme:
...snip...
http {
server {
resolver $NAMESERVER valid=10s;
...snip....
}
}
}
Votre script de démarrage peut ensuite utiliser le
envsubst
programme 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/*.conf
dans 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/bin
dans 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 local
argument spécial à la resolver
directive qui, lorsqu'elle est définie sur local=on
, signifie que le chemin standard de /etc/resolv.conf
sera 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
,grep
nitr
là-dedans.