Среда, 3 Декабрь 2008
nginx: $is_bot?
Продолжая описывать и выкладывать свои «фичи» для nginx, я не мог пропустить is_bot.
Читая про борьбу с ботами и ужасаясь огромным if'ам
, мне захотелось помочь людям. Патч добавляет две опции в конфиг (is_bot_by и is_bot_data), одну переменную ($is_bot) и опцию в скипт configure (—with-http_is_bot_module). Использовать их все можно так:
is_bot_by $http_user_agent;
is_bot_data /path/to/data;
if ($is_bot) {
return 403;
}
В is_bot_data
пишутся строки, которые характеризуют бота (например user-agent), с которыми будет сравниваться строка из is_bot_by
. Если условие совпали то эта строка будет установлена в $is_bot.
Комментарии
Интересный модуль. пока не пробовал, но такие вопросы возникли: не совсем понятно, сравнение регуляркой(как например в той же рассылке) или на полную идентичность? И насколько быстро работает? Не было бы лучше как гео-модуль, просто при обновлении конфига/старте загружать в память весь список и искать по нему? возможно даже придумать что-то типа ключей на хешах и радикс-дерево использовать… о…или использовать файл, а в память загрузить хеши каждой строки и потом только хеши и сравнивать просто мысли вслух :)
Именно по мыслям он и сделан.
Т.е. файл загружается в память из него строить хеш и по нему ищется.
Да, ищеться на полную идентичность с учетом регистра.
на github есть упоминание про версию 0.2, где можно ее посмотреть, чтобы не качать весь реп?
Обновил patch, спасибо.
Там исправления не в модуле, а в хешах.
почему-то вторая версия накладывается не так просто как первыя, ругается: “Reversed (or previously applied) patch detected! Assume -R? [n]”…накладывал на нгинкс с патчами response и request_per_seconds…понятно, что можно наложить через -R, но некоторый разнобой с патчами…
Да, я совсем сума сошел при генерации патча. Спасибо.
Нашел незначительную ошибку: если нет переноса строки после последней записи в файле, то эта последняя запись не участвует в разборе полетов. А вообще модуль(пока смотрел только 0.1) получился довольно шустрый. тестировал два файла с одной записью и с 22 тысячами(примерно на один мегабайт) :) и выдавал через response если совпадал с ботом…что в первом случае, что во втором, выдача была в районе 10-11 тысяч запросов в секунду, с учетом статистической погрешности. Один “минус” — потребление памяти VSZ выросло с 26.5МБ до 116.5, то есть выросло на 90метров(!)…странно с учетом всего 1 метрового ботового файла. RSS же увеличился незначительно, на полметра.
Про эту ошибку я знаю и она, помойму, должна быть исправлена в 0.2 версии. Хотя не уверен :)
Про потребелние памяти надо смотреть. Но этому модулю очень хорошо помогает obsd-malloc в борьбе с ним. Надо будет подумать еще как оптимизировать потребление памяти.
Но всеравно спасибо за тестирование.
патч пустой
Какой именно?
это был старый коммент, я просто не к той записи его отправил :)
для прикола сделал размер файла 24 метра, просто засунул туда список из /var/ и /usr/ :)… записей оказалось 404 тысячи, RSS каждого процесса около 38мегабайт(+23.5 метров в сравнении с пустым), VSZ же вырос до 1.7гигабайта :))) На скорости почти не сказалось, после нескольких тестов максимальное расхождение с 1мегабайтным было 13 процентов, а так и 1-2%…
Когда писал его я, я смотрел на потребление сквозь пальца (главным была скорость работы, я думаю ты уже отценил).
Про потребление памяти — подумаю.
Форма комментирования для «nginx: $is_bot?»
А можно попросить выслать тестовые данные.
Просто мне до 1.7 гигабайт раздуть не удается. 300 мегабайт мог, но входных данных было около 100 мегабайт.