Как вычислить, кто вешает сервер?
Около недели назад яндекс вебмастер начал присылать уведомления о том, что время ответа всех сайтов на сервере периодически вырастает до 30-60 сек (полный ахтунг). Техподдержка дала ответ, что с 22 июня нагрузка на сервер возросла, и даже приложила скрин (см. ниже). Они посетовали на активность вредоносных ботов, коих и заблокировали. Однако проблема не исчезла.
А как бы мне теперь вычислить подонка, который вешает мои сайты? Запускал atop, но момента, когда виснет сервер, поймать не смог. Может быть, где-то в логах можно найти пиковые нагрузки и узнать, кто в этом виноват? Доступ по ssh имеется.
Заранее спасибо!
Upd 07.07.2020
По какой-то причине atop не хочет признаваться, кто же кушает процессорное время. То, что нагружается процессор, видно по этому скрину:
Там еще память регулярно немного скачет, но это я знаю, что такое. А вот пиковые нагрузки процессора для меня остаются загадкой.
В atop установил интервал в 60 секунд, однако он вообще не показывает мне таких скачков. Например, загрузка процессора составляла 100% в 4:37 утра. Прикладываю лог atop'a на этот момент - у него все хорошо, проц простаивает :-/
Ответы (2 шт):
Однозначно стоит копать логи, можно параллельно гуглить, как защищаться от DDoS. Не факт, что это именно DDoS, но методики решения могут быть схожими.
Для начала нужно определить, какой из сервисов дает высокую нагрузку, это внезапно может оказаться вообще не веб-сервер, а например DNS сервер, или еще что-то, к чему есть доступ извне.
Еще определите, что является причиной отказа: процессор, память, дисковая система, что-то еще?
Когда обнаружите проблемный сервис и причину отказа, смотрите в его логи глубже, если это веб-сервер, то какая его часть? Например, если nginx, то нагружать может php-fpm, или сам nginx. Допишите отслеживающих правил в фаервол, смотрите, что именно генерит трафик, какого он типа, какие это запросы по каком протоколу.
И вот тогда можно уже будет целенаправленно раздавать баны.
Пишем скрипт, который чекает нагрузку на сервере и делает снапшоты top-a при высокой нагрузке
#!/bin/bash
avg=$(cat /proc/loadavg | awk -F "." '{print $1}')
if [ "$avg" -gt 10 ]
then
top -b -n 1 >> /tmp/htop_snapshot_full.log && cat /tmp/full_htop_snapshot.log | awk '$9 > 1' > /tmp/htop_snapshot_filtred.log
fi
Заталкиваем его в крон и ставим выполнение каждую минуту(ну или по вашему усмотрению). В моем примере есть подобие фильтрации, его можно убрать.
*/1 * * * * /home/top_snapshot.sh
Анализируем лог, что конкретно грузит. Далее, соответственно, идем анализировать логи программ, которые находились под нагрузкой.
Если у вас есть финансовые мощи, рекомендую затолкать ваш трафик за какой нибудь cloudflare.
Возможно стоит проверить настройку вашего фаервола на наличие "лишних" разрешений.


