Por que um servidor linux deve ser reiniciado para lidar adequadamente com uma alteração no resolv.conf?

8

Eu sei que isso deve ser apenas uma falta de entendimento, mas aqui está o problema.

Recentemente, alteramos os servidores DNS de 192.168.1.1 para .2, então eu passei pelos 8 servidores linux e alterei o /etc/resolv.conf para refletir a alteração. Observe que eles são todos estáticos, não há DHCP envolvido.

Depois de fazer a alteração, posso testar imediatamente os resultados usando nslookup e dig, e tudo fica bem. Fiz uma reinicialização do /etc/init.d/networking - para reiniciar o subsistema de rede - e reiniciei o apache e o postfix em cada um dos servidores, apenas para ter certeza.

Alguns dias depois, recebo um relatório informando que nossos sites não estão mais enviando e-mails. Examinando os logs, descobri que o processo mod_php não conseguia resolver as entradas DNS para enviar email. Depois de bater minha cabeça por cerca de 30 minutos, reiniciei o servidor e tudo voltou ao normal.

No dia seguinte, em um servidor diferente (usando o CentOS em vez do Ubuntu normal), recebo um relatório informando que os emails não estão sendo enviados e, com certeza, olhando os logs indica que o Postfix não pode resolver nomes. Reinicializado e entrega quase instantaneamente todas as mensagens em fila.

Então, o que estou perdendo aqui? Que parte desse processo não entendi corretamente?

cinzento
fonte

Respostas:

11

Você provavelmente foi mordido pelo nscd: http://linux.die.net/man/8/nscd

Felicidades

HTTP500
fonte
Obrigado! Parece altamente possível que isso é o que estava me dando problemas. Eu nem sabia que o cache local de DNS fazia parte do sistema linux comum.
Grey
Você realmente testou? A hipótese de Jason é possível, mas não certa.
Bortzmeyer
@bortzmeyer - sim, eu concordo. Sua própria resposta é a mesma que eu teria dado (e de fato tenho que duas perguntas relacionadas recentemente). É muito mais provável que o estado res_init () seja armazenado em cache do que o nscd.
Alnitak
8

A maioria dos aplicativos inicializa o resolvedor uma vez, na inicialização (com res_init), e nunca o faz novamente depois. Não é um problema para aplicativos de vida curta, como o ping, mas mais sério para daemons de longa duração.

O processo Apache (que executa o mod_php) provavelmente foi nesse caso. Reiniciar o Apache seria suficiente.

bortzmeyer
fonte
3

O resolv.conf direciona os resolvedores para onde procurar nomes. Na maioria dos casos, esse será o resolvedor libc, mas pode haver outros casos, como o vPostMaster, que usa a biblioteca de resolvedores DNS do Python para pesquisas do SPF.

Assim, poderia ser que o resolvedor é o cache as informações resolv.conf para processos de longa duração, mas soou como você postfix reiniciado, o que deve ter causado isso para começar a usar um arquivo resolv.conf fresco.

Verifique seu /etc/nsswitch.conf para ver se ele especifica algo especial acontecendo para "hosts". Por exemplo, a linha padrão do Fedora 11 no meu laptop é:

hosts: arquivos mdns4_minimal [NOTFOUND = return] dns

Portanto, neste caso, ele usa mdns, bem como / etc / hosts e DNS. Nesse caso, se as alterações de DNS não estivessem sendo detectadas, eu me perguntaria se eram os mdns que estavam causando isso.

Sean

Sean Reifschneider
fonte
1

Provavelmente algum cache está acontecendo. Tivemos um problema semelhante sendmaile o reinício do serviço foi corrigido.

Às vezes, é mais fácil reiniciar o servidor e limpar todos os caches em qualquer lugar do sistema do que gastar todo esse tempo identificando qual serviço está armazenando em cache por muito tempo. Por outro lado, pode ser um investimento quando acontece novamente e você sabe qual serviço reiniciar.

jldugger
fonte
Concordo que a reinicialização é a saída mais fácil, mas se o servidor for crítico, pode ser difícil encontrar tempo para reiniciá-la. Obrigado pela ajuda!
Grey