为什么必须重新启动 Linux 服务器才能正确处理 resolv.conf 中的更改?

为什么必须重新启动 Linux 服务器才能正确处理 resolv.conf 中的更改?

我知道这只是因为我的理解不够,但问题就是这样的。

我们最近将 DNS 服务器从 192.168.1.1 更改为 .2,因此我查看了所有 8 台 Linux 服务器,并更改了 /etc/resolv.conf 以反映此更改。请注意,它们都是静态的,不涉及 DHCP。

进行更改后,我可以立即使用 nslookup 和 dig 测试结果,一切看起来都很好。我执行了 /etc/init.d/networking restart - 重新启动网络子系统 - 并在每台服务器上重新启动了 apache 和 postfix,以确保万无一失。

几天后,我收到一份报告,称我们的一个网站不再发送电子邮件。仔细查看日志后,我发现 mod_php 进程无法解析 dns 条目以发送邮件。经过大约 30 分钟的思考后,我重新启动了服务器,一切恢复正常。

第二天,在另一台服务器上(使用 CentOS 而不是我们常用的 Ubuntu),我收到一份报告,指出电子邮件无法发送,果然,查看日志表明 Postfix 无法解析名称。重新启动后,它几乎立即发送了所有排队的邮件。

那么我在这里遗漏了什么?我没有正确理解这个过程的哪一部分?

答案1

你可能被 nscd 咬了:http://linux.die.net/man/8/nscd

干杯

答案2

大多数应用程序在启动时(使用 )初始化一次解析器res_init,之后再也不会这样做。对于像 ping 这样寿命较短的应用程序来说,这不是问题,但对于长期运行的守护进程来说,问题就比较严重了。

Apache 进程(运行 mod_php)可能就是这种情况。重新启动 Apache 就足够了。

答案3

resolv.conf 指示解析器在哪里查找名称。在大多数情况下,这将是 libc 解析器,但也可能存在其他情况,例如 vPostMaster 使用 Python DNS 解析器库进行 SPF 查找。

所以可以可能是解析器正在为长时间运行的进程缓存 resolv.conf 信息,但听起来您重新启动了 postfix,这应该导致它开始使用新的 resolv.conf 文件。

检查 /etc/nsswitch.conf,看看它是否指定了“主机”发生的任何特殊情况。例如,我的笔记本电脑上的默认 Fedora 11 行是:

主机:文件 mdns4_minimal [NOTFOUND=return] dns

因此,在这种情况下,它使用 mdns 以及 /etc/hosts 和 DNS。在这种情况下,如果没有检测到 DNS 更改,我会怀疑是否是 mdns 导致了这种情况。

肖恩

答案4

可能是缓存问题。我们也遇到过类似的问题,sendmail只需重启服务即可解决。

有时,只需重新启动服务器并清除系统中所有缓存,比花费大量时间确定哪个服务缓存时间过长要容易得多。另一方面,当这种情况再次发生时,您知道需要重新启动哪个服务,那么这可能是一项投资。

相关内容