Назад | Перейти на главную страницу

Зависание Apache, как определить, какой виртуальный хост поражен?

У меня есть рабочий сервер, который за последние 24 часа был жестко перезагружен 4 раза из-за зависаний. Пинг в порядке, но время ожидания всех других служб (Apache, SSHd и т. Д.) Теперь я диагностировал это: Apache исчерпывает память из-за чрезмерного количества дочерних процессов, внезапно разветвляющихся в течение нескольких секунд после запуска Apache. Остановка Apache сразу после перезагрузки обеспечивает стабильную работу сервера.

Мои два вопроса:

  1. Есть ли способ определить, какой из виртуальных хостов внезапно сбивается, не просматривая журнал доступа каждого виртуального хоста один за другим?

  2. Есть ли способ быстро включить / отключить 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.