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

18

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

Pode ser útil, por exemplo, na janela de encaixe ou no ambiente virtual.

Nikolai Golub
fonte

Respostas:

16

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

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

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) módulo perl experimental e escreve um manipulador de variáveis:

http {

    perl_modules perl/lib;
    perl_set $resolvers '

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

    resolver "$resolvers";
}

Agora, se você é um codificador C infernal (prepare seus olhos para um pouco de sangue), ainda pode escrever um patch ou módulo alternativo para fazê-lo funcionar dessa maneira.

Xavier Lucas
fonte
6

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

Aqui está uma solução alternativa para pessoas que usam o Docker.

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

O que isso faz é pegar todas as nameserverentradas /etc/resolv.confe imprimi-las em uma linha, para que você possa usá-las com a resolverdiretiva nginx . Seu Dockerfile precisará ter um script personalizado para o ponto de entrada que gera o arquivo de configuração e, em seguida, inicia o nginx. Digamos que você tenha um arquivo chamado nginx.conf.templateque se parece com:

...snip...
http {
  server {

    resolver $NAMESERVER valid=10s;

    ...snip....  
    }
  }
}

Seu script de inicialização pode usar o envsubstprograma para gerar um nginx.confe, em seguida, iniciar o nginx. por exemplo:

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

NOTA: na janela de encaixe isso tende a resultar no mesmo arquivo, pois, por padrão, o servidor DNS incorporado na janela de encaixe é 127.0.0.11 , consulte esta resposta no Docker Network Nginx Resolver .

FelikZ
fonte
2
Awk, aprendê-la, é uma ferramenta fantástica para munging texto: export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf). Não há necessidade cat, grepou trlá dentro.
J0057 3/07
isso não funciona no Kubernetes.
Kim
1

Se o seu sistema usa resolvconf (como muitas máquinas virtuais, mas infelizmente o Docker não vê 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 caso raro 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 Linux incluem /etc/nginx/conf.d/*.confem sua configuração padrão. A recarga geralmente é ignorada quando o serviço não está sendo executado. Observe que o script pode ser executado sem /usr/binno PATH, portanto, você pode precisar de um caminho absoluto para ativar o awk.

Marko Kohtala
fonte
1

Se você estiver usando a versão Openresty do nginx, poderá usar seu localargumento especial para a resolverdiretiva que, quando definida como local=on, significa que o caminho padrão /etc/resolv.confserá usado pelo resolvedor (para obter mais detalhes, consulte os documentos do resolvedor Openresty ):

resolver local=on;
Pierz
fonte