Wednesday, 3 December 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.

Write on: 3:59 | 14 comments | | tags: , , , , | permalink |
Add post to:   Delicious Reddit Slashdot Digg Technorati Google


Add comment

Comments

Alrond 27.12.2008 23:48

Интересный модуль. пока не пробовал, но такие вопросы возникли: не совсем понятно, сравнение регуляркой(как например в той же рассылке) или на полную идентичность? И насколько быстро работает? Не было бы лучше как гео-модуль, просто при обновлении конфига/старте загружать в память весь список и искать по нему? возможно даже придумать что-то типа ключей на хешах и радикс-дерево использовать… о…или использовать файл, а в память загрузить хеши каждой строки и потом только хеши и сравнивать просто мысли вслух :)

reply

Comment form for «nginx: $is_bot?»

Required. 30 chars of fewer.

Required.

Kirill A. Korinskiy 28.12.2008 11:10

Именно по мыслям он и сделан.

Т.е. файл загружается в память из него строить хеш и по нему ищется.

Да, ищеться на полную идентичность с учетом регистра.

reply
Alrond 28.12.2008 15:05

на github есть упоминание про версию 0.2, где можно ее посмотреть, чтобы не качать весь реп?

reply
Kirill A. Korinskiy 28.12.2008 16:31

Обновил patch, спасибо.

Там исправления не в модуле, а в хешах.

reply
Alrond 28.12.2008 17:10

почему-то вторая версия накладывается не так просто как первыя, ругается: “Reversed (or previously applied) patch detected! Assume -R? [n]”…накладывал на нгинкс с патчами response и request_per_seconds…понятно, что можно наложить через -R, но некоторый разнобой с патчами…

reply
Kirill A. Korinskiy 29.12.2008 0:35

Да, я совсем сума сошел при генерации патча. Спасибо.

reply
Alrond 28.12.2008 16:24

Нашел незначительную ошибку: если нет переноса строки после последней записи в файле, то эта последняя запись не участвует в разборе полетов. А вообще модуль(пока смотрел только 0.1) получился довольно шустрый. тестировал два файла с одной записью и с 22 тысячами(примерно на один мегабайт) :) и выдавал через response если совпадал с ботом…что в первом случае, что во втором, выдача была в районе 10-11 тысяч запросов в секунду, с учетом статистической погрешности. Один “минус” — потребление памяти VSZ выросло с 26.5МБ до 116.5, то есть выросло на 90метров(!)…странно с учетом всего 1 метрового ботового файла. RSS же увеличился незначительно, на полметра.

reply
Kirill A. Korinskiy 28.12.2008 16:33

Про эту ошибку я знаю и она, помойму, должна быть исправлена в 0.2 версии. Хотя не уверен :)

Про потребелние памяти надо смотреть. Но этому модулю очень хорошо помогает obsd-malloc в борьбе с ним. Надо будет подумать еще как оптимизировать потребление памяти.

Но всеравно спасибо за тестирование.

reply
Alrond 28.12.2008 16:45

патч пустой

reply
Kirill A. Korinskiy 29.12.2008 0:37

Какой именно?

reply
Alrond 29.12.2008 0:57

это был старый коммент, я просто не к той записи его отправил :)

reply
Alrond 28.12.2008 16:44

для прикола сделал размер файла 24 метра, просто засунул туда список из /var/ и /usr/ :)… записей оказалось 404 тысячи, RSS каждого процесса около 38мегабайт(+23.5 метров в сравнении с пустым), VSZ же вырос до 1.7гигабайта :))) На скорости почти не сказалось, после нескольких тестов максимальное расхождение с 1мегабайтным было 13 процентов, а так и 1-2%…

reply
Kirill A. Korinskiy 29.12.2008 0:37

Когда писал его я, я смотрел на потребление сквозь пальца (главным была скорость работы, я думаю ты уже отценил).

Про потребление памяти — подумаю.

reply
Kirill A. Korinskiy 29.12.2008 14:59

А можно попросить выслать тестовые данные.

Просто мне до 1.7 гигабайт раздуть не удается. 300 мегабайт мог, но входных данных было около 100 мегабайт.

reply