Я арендую виртуальную машину Linux у LayeredTech, которая является гостем на гипервизоре Xen. Операционная система - CentOS 5.3, работающая под управлением Apache2. Почти каждый день мой сервер ведет себя таким образом, что заставляет меня думать, что я подвергся DDoS-атаке, но я не могу найти никаких доказательств как таковых. Я использую Apache Mod_security, MySQL 5.x, PHP 5.x, все обновлено с точки зрения версии.
Виртуальная машина относительно маломощна, но когда этот симптом не проявляется, она отлично справляется с нагрузкой моего веб-трафика.
Мой веб-сервер перестанет отвечать, и после входа в систему будут выполняться сотни процессов HTTPD. Все мои виртуальные хосты привязаны к chroot и используют SUexec, но все порожденные процессы работают как пользователь "apache".
На моем компьютере не работает вредоносный веб-сайт, и сервер не показывает никаких доказательств взлома.
Когда возникает проблема, мои средние нагрузки превышают 250, все, что мне нужно сделать, это принудительно перезапустить httpd, и все будет нормально в течение 24-72 часов.
Я просмотрел все файлы журналов, которые я могу найти, и я не могу найти никаких доказательств DDoS, какого-либо трафика типа «эффект digg», ничего. Как только я перезапускаю HTTPD, все, что заставляло его порождать столько процессов, останавливается. Если бы это было из-за веб-сайта с высоким трафиком, ссылки на главной странице огромного сайта или DDoS-атаки, я бы предположил, что запросы никогда не прекратятся, и я просто снова отключу мой сервер сразу после перезапуска httpd.
Я также использовал различные инструменты, такие как apachetop и другие инструменты мониторинга в реальном времени, но обычно я не могу предсказать, когда это произойдет, и к тому времени, когда это произошло, сервер слишком перегружен, чтобы даже что-либо, кроме уничтожения HTTPD.
Я не знаю, как этого избежать, и я не знаю, где еще искать причину - любые идеи будут оценены!
Дополнительная информация:
Прошло около 2 лет с тех пор, как я построил сервер, и я настроил эти параметры на основе некоторых вещей, которые я прочитал, и никогда не было проблем, но я не уверен, могут ли эти параметры быть одним из факторов:
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>
# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule worker.c>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
Вы уверены, что в журналах ничего нет?
Вы можете настроить MPM worker Apache, чтобы ограничить количество процессов, которые он запускает / управляет.
Существует также малоизвестная DDoS-атака, которая поддерживает соединения (механизм HTTP Keep-Alive) вместо того, чтобы закрывать их по завершении, и это может вызвать запуск сотен дополнительных процессов, поскольку Apache считает, что он обрабатывает запросы от этих процессов DDoS и генерирует новые для новых процессов.
Когда вы перезапускаете Apache, он уничтожает эти мошеннические процессы и, следовательно, соединения, поэтому все зависит от того, сколько времени потребуется злоумышленнику, чтобы понять, что он отключился, и повторить попытку.
Вы также можете включить обработчики состояния сервера и информации о сервере и наблюдать за ними, когда он начинает загружаться, чтобы определить, что делает сервер.