Доброго времени суток.
Хотя речь пойдёт об nginx, тема скорее имеет отношение к алгоритмам и программированияю. Есть лог nginx, нужно подобрать ограничения, чтобы отрезать ботов.
Ограничение числа запросов за единицу времени в nginx задаётся через 2 синтетические величины, rate и burst
excess = lr->excess - ctx->rate * ngx_abs(ms) / 1000 + 1000;
if (excess < 0) {
excess = 0;
}
[...]
if ((ngx_uint_t) excess > limit->burst) {
return NGX_BUSY;
}
Приблизительно можно считать, что rate ограничивает частоту поступления запросов, burst - позволяет пропускать пики запросов.
Например, пусть rate=5, burst=100. nginx пропустит запросы пользователя, который одновременно прислал 80 запросов, потом успокоился на 2 минуты. Но ограничит бота, который шлёт запросы с частотой 6 запросов в секунду ( хотя и не сразу, а примерно через 80 секунд с момента запуска бота ). Т.е. даётся некоторый запас burst, при превышении - жёстко режем по rate
У меня есть лог. Пусть для простоты имеем одного клиента. В логе время каждого обращения, в unixtime ( опять же для простоты )
unixtime1
unixtime2
unixtime3
...
unixtimeN
Вижу, что параметры можно подбирать - написать симулятор ( вход - rate, burst, лог ; выход - блокированные запросы ) и подбирать burst и rate. А хотелось бы не брутфорсить, а вычислять эти значения. Можно ли из лога вычислить достаточные burst и rate?
update В итоге написал пару скриптов. Комментарии внутри. Для понимания нужен средний скил Perl