Почему сервер Linux должен быть перезагружен, чтобы правильно обрабатывать изменения в resolv.conf?

8

Я знаю, что это просто недостаток моего понимания, но вот проблема.

Недавно мы изменили DNS-серверы с 192.168.1.1 на .2, поэтому я перешел на все 8 моих серверов linux и изменил /etc/resolv.conf, чтобы отразить это изменение. Обратите внимание, что все они статичны, DHCP не задействован.

После внесения изменений я могу сразу проверить результаты с помощью nslookup и копать, и все это выглядит хорошо. Я сделал перезапуск /etc/init.d/networking - чтобы перезапустить сетевую подсистему - и перезапустил apache и postfix на каждом из серверов, чтобы быть уверенным.

Через несколько дней я получаю отчет о том, что наши сайты больше не отправляют электронные письма. Просматривая журналы, я обнаружил, что процесс mod_php не может разрешить записи DNS для отправки почты. После того, как я в течение 30 минут ударил меня по голове, я перезагрузил сервер, и все вернулось на круги своя.

На следующий день на другом сервере (использующем CentOS, а не нашу обычную Ubuntu) я получаю отчет о том, что электронные письма не проходят, и, конечно же, просмотр журналов указывает, что Postfix не может разрешать имена. Перезагрузился, и он почти мгновенно доставляет всю почту в очереди.

Так чего мне здесь не хватает? Какую часть этого процесса я не понял правильно?

Серый
источник

Ответы:

11

Вы, вероятно, укусили nscd: http://linux.die.net/man/8/nscd

ура

HTTP500
источник
Спасибо! Кажется весьма вероятным, это то, что доставляло мне проблемы. Я даже не знал, что локальное DNS-кэширование является частью общей системы Linux.
Серый
Вы на самом деле тестировали? Гипотеза Джейсона возможна, но не точна.
Борцмейер
@bortzmeyer - да, я согласен. Ваш собственный ответ такой же, как я бы дал (и действительно, недавно пришлось ответить на два связанных вопроса). Вероятность кеширования в состоянии res_init () гораздо выше, чем в nscd.
Альнитак,
8

Большинство приложений инициализируют распознаватель один раз, при запуске (с res_init), и никогда не делают это позже. Это не проблема для приложений с коротким сроком службы, таких как ping, но более серьезна для долго работающих демонов.

Процесс Apache (который запускает mod_php) был, вероятно, в этом случае. Перезапуска Apache будет достаточно.

bortzmeyer
источник
3

resolv.conf указывает резолверам, где искать имена. В большинстве случаев это будет решатель libc, но могут быть и другие случаи, например vPostMaster, который использует библиотеку DNS-преобразователя Python для поиска SPF.

Таким образом, он МОГ быть, что распознаватель кэширует информацию resolv.conf для долго выполняющихся процессов, но это звучит так, как будто вы перезапустили postfix, что должно было заставить его начать использовать свежий файл resolv.conf.

Проверьте ваш /etc/nsswitch.conf, чтобы увидеть, указывает ли он что-то особенное для «хостов». Например, строка Fedora 11 по умолчанию на моем ноутбуке выглядит так:

hosts: файлы mdns4_minimal [NOTFOUND = return] днс

Так что в этом случае он использует mdns, а также / etc / hosts и DNS. В этом случае, если изменения DNS не регистрировались, я бы подумал, что причиной были именно mdns.

Шон

Шон Рейфшнайдер
источник
1

Вероятно, происходит некоторое кеширование. У нас была похожая проблема, sendmailи только перезапуск службы исправил ее.

Иногда проще просто перезагрузить сервер и очистить все эти кэши в любом месте системы, чем тратить все это время на определение того, какая служба слишком долго кэширует. С другой стороны, это может оказаться инвестицией, когда это произойдет снова, и вы знаете, какую службу перезапустить.

jldugger
источник
Я согласен, перезагрузка - самый простой выход, но если сервер критичен, найти время для перезагрузки может быть сложно. Спасибо за вашу помощь!
Серый