Endereço do resolvedor Nginx de /etc/resolv.conf

14

É possível definir o endereço resolver na configuração do proxy nginx em /etc/resolv.conf ?

Pode ser útil, por exemplo, no docker ou no ambiente virtual.

    
por Nikolai Golub 22.10.2014 / 14:59

3 respostas

13

Infelizmente, não há uma maneira fácil de fazer isso, porque o nginx usa sua própria implementação de resolvedor. As duas soluções que vejo são:

1) Você gera a lista de resolvedores a partir de um script e a inclui, por ex. :

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

http {

    include resolvers.conf;

}

2) Você recompila o nginx com um módulo de terceiros como o (muito) experimental módulo perl e escreva um manipulador variável:

http {

    perl_modules perl/lib;
    perl_set $resolvers '

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

    resolver "$resolvers";
}

Agora, se você for um codificador C (preparar os olhos para um pouco de sangue), ainda poderá escrever um patch ou módulo alternativo para que ele funcione dessa maneira.

    
por 22.10.2014 / 16:37
3

Para usuários do Docker, a solução encontrou aqui :

Heres a workaround for people using Docker.

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

What this does is take all the nameserver entries from /etc/resolv.conf and print them in a line, so you can use them with nginx's resolver directive. Your Dockerfile will need to have a custom script for the entrypoint that generates the config file and then starts nginx. Lets say you have a file called nginx.conf.template that looks something like:

...snip...
http {
  server {

    resolver $NAMESERVER valid=10s;

    ...snip....  
    }
  }
}

Your startup script can then use the envsubst program to generate an nginx.conf and then start nginx. eg:

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

OBSERVE que no docker isso tende a resultar no mesmo arquivo, pois, por padrão, o servidor DNS integrado à janela de encaixe é 127.0.0.11 , consulte esta resposta para o Docker Network Nginx Resolver .

    
por 19.12.2016 / 17:58
1

Se o seu sistema usa resolvconf (como muitas máquinas virtuais, mas infelizmente o Docker não, veja man 8 resolvconf ), você pode criar o nginx resolvers.conf (como na outra resposta) em /etc/resolvconf/update-libc.d/nginx . Isso se comporta bem mesmo no raro caso de mudança dinâmica de resolvedores.

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

Algumas distribuições do Linux incluem /etc/nginx/conf.d/*.conf em sua configuração padrão. O recarregamento geralmente é ignorado quando o serviço não está em execução. Observe que o script pode ser executado sem /usr/bin no PATH, então você pode precisar de um caminho absoluto para o awk.

    
por 29.12.2015 / 22:27

Tags