É possível definir o resolver
endereço na configuração do proxy nginx /etc/resolv.conf
?
Pode ser útil, por exemplo, na janela de encaixe ou no ambiente virtual.
É possível definir o resolver
endereço na configuração do proxy nginx /etc/resolv.conf
?
Pode ser útil, por exemplo, na janela de encaixe ou no ambiente virtual.
Respostas:
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.
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
nameserver
entradas/etc/resolv.conf
e imprimi-las em uma linha, para que você possa usá-las com aresolver
diretiva 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 chamadonginx.conf.template
que se parece com:
...snip...
http {
server {
resolver $NAMESERVER valid=10s;
...snip....
}
}
}
Seu script de inicialização pode usar o
envsubst
programa para gerar umnginx.conf
e, 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 .
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/*.conf
em 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/bin
no PATH, portanto, você pode precisar de um caminho absoluto para ativar o awk.
Se você estiver usando a versão Openresty do nginx, poderá usar seu local
argumento especial para a resolver
diretiva que, quando definida como local=on
, significa que o caminho padrão /etc/resolv.conf
será usado pelo resolvedor (para obter mais detalhes, consulte os documentos do resolvedor Openresty ):
resolver local=on;
export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf)
. Não há necessidadecat
,grep
outr
lá dentro.