Вчера пришлось очень рано встать из-за SMS от монитора, наблюдающего за сервером: Apache лёг от DDoS-атаки. Как оказалось, DDoS был спровоцирован плагином Time Spent on Blog. Честно говоря, я никогда не понимал смысла в таких плагинах, тем более на очень посещаемых сайтах.
Плагин определяет, сколько времени пробыл пользователь на сайте (с двухсекундной точностью). Такая точность создаёт большие проблемы в тех случаях, когда средний посетитель открывает сразу три-пять страниц. Точность гарантируется конструкцией setTimeout("updateTime()", 2000)
, где updateTime()
— функция, отправляющая асинхронный запрос на сервер.
Обновление текущей информации осуществляется в два запроса: SELECT
для получения старых данных и INSERT
/UPDATE
для их обновления. Что характерно, в таблице нет никаких индексов, поэтому если у сайта обширная аудитория, а на сайте не настроена репликация, то MySQL очень быстро становится слабым звеном (что ни говори, а MyISAM не сильно хорошо работает с большим количеством параллельных записей). А IP-адрес посетителя (по нему делается выборка/обновление) хранится в базе строкой, что тоже далеко от идеала (экономнее хранить его числом).
Несколько сотен посетителей, открывшие по нескольку страниц, умудрились положить сервер. Далее