Было принято решение создать отдельный веб-сервер, чтобы отправлять на него трафик от поисковых и части других ботов.
Всего мы задействовали на проекте 4 сервера.
- Балансировщик веб-трафика, который фильтрует трафик и направляет его на один из следующих серверов.
- Основной веб-сервер, который обслуживает весь входящий поток посетителей кроме трафика от поисковых и некоторых других ботов.
- Веб-сервер для обслуживания запросов от поисковых и других ботов. На нем же развернули Slave-базу сайта. Задача этого сервера — убрать нагрузку с основного веб-сервера и снизить нагрузку на БД. Он расположен на отдельном физическом сервере.
- Сервер БД сайта, на котором расположена мастер-база сайта.
На основном сервере и сервере для ботов был установлен ProxySQL — это сервис, который проксирует запросы к базе данных. То есть запросы проходят не напрямую, а через прокси и часть из них кэшируется. Также на сервере для ботов происходило разделение запросов на изменение и чтение данных. Запросы на чтение шли на локальную Slave-базу, а на изменение — на мастер-базу.
Также ProxySQL мультиплицирует соединения к БД и уменьшает потребление памяти на сервере БД, что позволяет продолжать работать в рамках текущего объема памяти даже в моменты сильного наплыва ботов.
Отдельно прописали правила направления трафика по веб-серверам в зависимости от User-Agent клиента. Это позволяет отсечь входящие запросы от спам-ботов и ограничить нагрузку от ботов поисковых систем. В целях отладки добавили возможность отправлять трафик на другой сервер также и по IP-адресу клиента и таким образом отсечь ботов, которые занимаются регулярными атаками.
Также описали правила фильтрации трафика:
- Заблокировали часть клиентов по IP-адресу, для чего создали список нежелательных адресов и сетей.
- Установили глобальную блокировку клиентов по User-Agent, куда внесли имена нежелательных ботов, которые собирают статистику и информацию о сайте, и при этом создают дополнительную нагрузку.
- Добавили лимиты на количество запросов с одного IP-адреса.
- Путем сложной фильтрации направили на сервер для ботов GET-запросы от ботов из сетей мобильных операторов московского региона, откуда приходила значительная часть ботов.
Таким образом, мы стабилизировали работу сайта и устранили критическую угрозу. И если раньше даже небольшой наплыв ботов приводил к серьезным замедлениям, вплоть до «падения», то после доработки серверной архитектуры сайту стали не страшны даже массовые атаки и запросы со стороны ботов.
После чего уже можно было переходить к непосредственной оптимизации технической части.