Yvision.kz
kk
Разное
Разное
399 773 постов42 подписчика
Всяко-разно
1
23:09, 27 октября 2009

Как я ловил роботов

Команда разработчиков нашего сайта Shopline.kz недавно заметила, что веб-сервер начинает кушать память, до тех пор, пока не падает по OutOfMemory. Исследование процессов на сервере показало, что в момент его падения, на нём было открыто более сотни живых сессий. Статистика Google Analytics сообщает что огромного наплыва посетителей нет, и о сотне посетителей, вошедших одновременно речи быть не может. Внутренняя статистика при этом показывает что в сутки открывается 8-18 тысяч(!!!) сессий, хотя живых посетителей на порядки меньше.

Наш софт работает так, что на каждое посещение на сервере создаётся и хранится сессия пользователя. Получалось, что десятки тысяч сессий создаются скорее всего для посещения только одной страницы. Уже тогда возникло подозрение, что это "шалят" поисковые боты. Решили доработать внутреннюю статистику, которая подтвердила предположение, показав что с некоторых IP-адресов количество просматриваемых страниц в точности равно количеству создаваемых сессий. Пробивка IP по Whois показала имена хостов вроде robot06.rambler.ru, crawl-66-249-71-174.googlebot.com, msnbot-65-55-207-69.search.msn.com и т.д.
Получалось, что разными поисковиками индексируются десятки тысяч страниц в сутки, и при этом создаются десятки тысяч сессий. Время истечения срока действия сессии у нас установлено в 20 минут, хотя ботам она не нужна вообще. А вот у нас эти не нужные сессии съедали всю память и ложили сервак.

Вобщем суть проблемы прояснилась, настало время её решать. В первую очередь встал вопрос - кто из посетителей, создавших сессию является поисковым роботом? Поиск в гугле быстро рассказал, что роботы "представляются" определёнными именами при входе на сайт, указав своё имя в HTTP-заголовке "user-agent". Проанализировав ещё раз статистику, увидели что к нам чаще всего заходят боты yandex, googlebot, dolphin, stackrambler, msnbot (более полный список существующих ботов). Было решено добавить на сервере фильтр, который проверяет user-agent посетителя, и если это один из ботов, то устанавливает минимальный срок существования его сессии. Такое решение отлично сработало:

  • сервер "задышал легче", перестал "падать", стал показывать гораздо лучшую и стабильную доступность
  • статистика Google Analytics показала что время, затрачиваемое гугель-ботом на загрузку страницы при сканировании сайта, упало в разы
  • внутренняя статистика показала что на фоне общего повышения производительности и стабильности сервера, количество создаваемых сессий(читай - посещений ботами) выросло вдвое!

PS Я достаточно опытный J2EE-разработчик (7 лет опыта разработки на Java, сертификаты уровня Java-Programmer и Java-Developer), но область разработки Web-проектов для меня достаточно нова. Поэтому прошу не плеваться старых закалённых веб-девелоперов на то что, я делаю для себя такие вот "неожиданные открытия". Тем не менее, уверен что этот отчёт будет интересен многим разработчикам...

1