Об одном событии из жизни блога
Сравнительно недавно в жизни этого сайта произошло небольшое событие, природу которого мне так и не удалось установить.
В пятницу 16 августа 2019 года ресурс лег. Мониторилка мне написала, что сайт пятисотит. Достучаться до сервера по ssh не получается. Такое периодически бывает, когда еще один человек занимается инфраструктурой, где всё это крутится. Как правило, лежит около часа. Но к вечеру воскресенья ситуация не решилась. В понедельник (19.08.2019) вечером мне удалось получить доступ к консоли, и к ночи я всё починил.
Как это было
Захожу на сервер. Иду смотреть логи сайта: ошибки, связанные с базой данных. Смотрю на сервис БД в операционной системе, mysql не запущен, пытаюсь запустить - не запускается. Оказалось, что диск занят на 100%. Логи OctoberCMS "засрали" диск, порядка 40 Gb и mysql сервер не мог стартануть. Почистил логи, запустил mysql, смотрю результат - не работает. Консоль начала "тормозить". Попутно замечаю, что логи растут по несколько мб в секунду.
Тут стоит отвлечься и сказать, что на сервере помимо блога было еще 4 ресурса (один из которых завязан на работу с apache) и они также не работали. Сконфигурировано было так, что nginx отдавал статику и передавал apache обработку php.
Стоплю nginx и apache - сервер оживает, запускаю - тормозит. Интересно, интересно. Еще раз запускаю и сразу пробую зайти на сайт - удаётся попасть в админку, публичная часть не работает. По логам cms понятно, что достаточно много ошибок откуда-то из ядра Laravel. Force update cms и публичная часть доступна. Вроде можно выдохнуть, но нет. Блог начинает отвечать по 10 секунд. Решил заглянуть в Google Analytics и мои глаза открылись. На сайте одновременно 100 человек (обычно от 2 до 10 посетителей). Переношу ресуры, зависимые от apache в другое место, выкидываю apache и мигрирую на nginx + php-fpm. Всё более-менее оживает, ответы по 3 секунды, Google аналитика говорит, что онлайн 400 человек. На тот момент на сервере 1 Gb RAM и 1 CPU. Увеличиваю до 4 Gb RAM и 4 CPU, наконец-то всё работает. Вроде и банально, но nginx + apache не лучшая связка. Если есть возможность, то лучше обойтись без apache.
Про нагрузку
Блог на OctoberCMS неплохо держит нагрузку.
В рабочие часы по московскому времени онлайн держался ~ 900 посетителей (60% зарузка процессора), среднее время на сайте - 34 секунды, на 5 секунд меньше чем обычно. Весь трафик шёл на одну страницу 504 gateway time-out nginx и далее 1-2% посетителей уходило на другие страницы блога, в основном на 3 категорий поста: Linux, October CMS, Общее.
Если посмотреть на график, то кажется, что до этого посетителей не было вообще. Однако в будни заходит 900 человек, а в выходные 400. При большой нагрузке, буквально за несколько часов, перестал работать счётчик (надо бы написать issue).
Что это было?
Вначале я думал, что меня DDos`ят. На самом деле я до сих в этом не уверен на 100%. Но я проверял по Яндекс.Вебвизору, причем часа 2 и не нашёл ничего подозрительного. Если это и боты то они все выглядели как люди, у всех рандомные значение устройств, разрешение, ip адресов и всего остального. Они скролили страницы, двигали мышкой, бездействовали, потом опять скролили, кто-то переходил, куда-то нажимал и так далее.
Системы учета пометили трафик как "Переходы с поисковой системы go.mail.ru
". Зарегистрировался в webmaster.mail.ru
, но ничего не нашел. Пытался вбивать запросы, которые бы могли вести на мой сайт, но даже на 1ой странице результатов ничего не было. А трафик как внезапно пришёл, так и ушёл. В эти 4 дня суточная посещаемость была ~ 165 000 посетителей.
Дальнейшие анализ падения сервера:
- Примерно 8 августа было обновление моего сервера, после чего периодически появлялись ошибки + страницы сайта стали доступны не только как clean url, но и через index.php.
- Высокая нагрузка 16 августа сделала много "периодических" ошибок => логи ошибок заполнили свободное пространство, отключились службы (mysql и другие)
Немного печали
В двух словах: Google меня забанил в Adsense через 1,5 месяца после этого события. И я связываю эти события между собой. Событие печальное потому, что на аккаунте было 88$ набранные за 2 года существования (выводить можно по 100$). Я расчитывал, что через 2 месяца их выведу, какая-никакая материальная выгода от ресурса. Основная причина, почему я внимательно изучал Яндекс.Вебвизор, была в том, что я подозревал накрутку и думал отключить на время рекламу. Так как ничего подозрительного не обнаружил, в том числе изменения CTR, то и рекламу не стал отключать. А она, родимая, в эти 4 дня приносила по ~ 100$ в сутки, что в суммы вылилось в 462$. Я подал на апелляцию, но её отклонили. Не видать как этих 462$, так и тех 88$. Мне пожизнено запрещено участвовать в этой программе от Goolge. Привет, Яндекс!
Goolge не объясняет причин блокировки, но если эти события связаны между собой, а трафик действительно пригнал злоумышленник, то оказывается, что легко можно подставить какой-либо новостной ресурс, чей основной доход зависит от контекстной рекламы.