У меня есть рабочий сервер, который за последние 24 часа был жестко перезагружен 4 раза из-за зависаний. Пинг в порядке, но время ожидания всех других служб (Apache, SSHd и т. Д.) Теперь я диагностировал это: Apache исчерпывает память из-за чрезмерного количества дочерних процессов, внезапно разветвляющихся в течение нескольких секунд после запуска Apache. Остановка Apache сразу после перезагрузки обеспечивает стабильную работу сервера.
Мои два вопроса:
Есть ли способ определить, какой из виртуальных хостов внезапно сбивается, не просматривая журнал доступа каждого виртуального хоста один за другим?
Есть ли способ быстро включить / отключить vhosts, не комментируя (#) их все в httpd.conf?
Несколько деталей системы:
Fedora 10, x86_64, PHP 5, Apache 2.2
Попробуйте настроить страницу состояния с помощью mod_status. Если вы можете войти после запуска сервера, вы должны увидеть страницу как это который показывает каждое соединение с его соответствующим виртуальным хостом и URL.
Если ваш сайт настолько сильно затоплен, что вы не можете войти, попробуйте запустить netstat -nt | grep :80
или lsof -ni tcp:80
чтобы увидеть, не наводняют ли ваш сайт один или два адреса, и соответственно примените iptables.
1) Я часто использую lsof чтобы узнать, какие файлы / каталоги открывает apache во время высокой нагрузки. Так, например (в debian / ubuntu) вы можете запустить:
lsof -u www-data
а затем, чтобы получить что-то более полезное, ищите только открытые файлы в правильном месте (например, / home), а затем исключите файлы журнала, которые всегда должны быть открыты.
lsof -u www-data | grep /home | grep -v *.log
Возможно, вам придется запустить это несколько раз, чтобы понять, что часто выполняется.
2) Если у вас запущен debian / ubuntu, вы можете использовать a2ensite и a2диссит для автоматического добавления и удаления vhosts из вашей установки apache.