Скан-боты ложат сервер, переполняя таблицу сессий

[Удален]
1926

Есть выделенный сервер. На нем стоит высокопосещаемый сайт на частично переписанной CMS Joomla 1.5. При каждом посещении сайта для посетителя открывается сессия, которая записывается в куку, и пишется в специальную таблицу MySQL, которая имеет тип MEMORY (в памяти).

Периодически на сайт приходят боты. И шлют кучу запросов. Что именно они делают - парсят сайт для воровства контента или ищут уязвимости - не знаю. На сервере есть программная защита от небольших DDoS - при большом кол-ве запросов с одного IP он банится. Но тут ситуация иная - эти хитрые боты не шлют кучу запросов, а работают равномерно, шля по 2-3 запроса в секунду, не превышая лимит, и делают это с нескольких IP.

Т.к. боты не дружат с куками, каждый их запрос создает отдельную сессию. В итоге после нескольких минут нашествия ботов с каждым их запросом таблица сессий растет как на дрожжах, переполняется и база ложится.

Тип MEMORY имеет ограничение в кол-во строк, в нашем случае 8192, и при переполнении сайт виснет. Перевести эту таблицу в MyISAM нецелесообразно, т.к. упадет скорость работы, да и она запросто может превысить размер в несколько десятков гигов и положить уже сам сервис мускула.

Отменить создание сессий для гостей невозможно, т.к. этот кривой механизм заложен в само ядро CMS, хотя смысл этого не понятен.

Что можно предпринять для борьбы со злом?

Skom
На сайте с 02.12.2006
Offline
165
#1

Анализировать логи, отстреливать ботов.

Cras amet qui numquam amavit quique amavit cras amet
A
На сайте с 03.06.2011
Offline
29
#2

Самое простое решение - перести сессии в memcache.

Andreyka
На сайте с 19.02.2005
Offline
822
#3

Нет, самое простое - кеширование на стороне nginx

Не стоит плодить сущности без необходимости
Vin_cent
На сайте с 22.01.2010
Offline
171
#4

1. Увеличить размер memory таблицы (max_heap_table_size). Ограничение в "8192 строк" как-то не серьёзно.

2. Кто подчищает эту таблицу сессий? Когда и при каком условии? Можно чистить самому когда нужно...

3. Переписать движок cms, в той части, где он делает всем сессии. Ядро-мудро, это всё не важно. Возможно всё.

D
На сайте с 28.06.2008
Offline
1108
#5

Andreyka верно посоветовал - у меня есть сайт на Joomla 1,5 в пик бывало до 600 чел онлайн, в сутки до 100.000 хостов.

С кешированием Нгихс даже такой нагрузки сервер почти не замечал. Сессии в memcache я тоже пробовал, но потом отказалася, медленно работало даже на сокетах.

А таблица сессий у меня тоже мемори.

alexspb
На сайте с 14.11.2005
Offline
187
#6

vois, джумла, тем более старая версия - это криво.

Соответственно и решения будут в дальнейшем, в основном кривые.

Один из способов различить ботов и реальных людей - js.

т.е. можно прописать при загрузке страницы обращение js к спец. файлу, что позволит ставить нужную метку.

[Удален]
#7

vois, изучайте логи nginx. Очень часто боты создают необычные запросы: некорректные рефереры, запросы с лишними слэшами, непонятные или идентичные для всех IP юзер-агенты. Это все легко перебанить.

Также изучите страны ботов. В последнее время сильно активными по выкачиванию контанта являются Саудовская аравия и Арабские Эмираты. Если страны вам не интересны отрежьте их с помощью geoip.

Vin_cent
На сайте с 22.01.2010
Offline
171
#8
alexspb:
vois, джумла, тем более старая версия - это криво.
Соответственно и решения будут в дальнейшем, в основном кривые.

Один из способов различить ботов и реальных людей - js.
т.е. можно прописать при загрузке страницы обращение js к спец. файлу, что позволит ставить нужную метку.

Представьте, например, что это не боты, а реальные посетители... Источник проблемы решать, а не его последствия.

alexspb
На сайте с 14.11.2005
Offline
187
#9
Vin_cent:
Источник проблемы решать, а не его последствия.

Экий вы ортодокс. По мне - надо искать самый простой (дешевый) способ.

AK
На сайте с 23.02.2009
Offline
117
#10
Andreyka:
Нет, самое простое - кеширование на стороне nginx

Лучше всего их отстреливать при помощи nginx :) (кстати, один из самых дурных - MajesticSEO)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий