Welcome! Log In Create A New Profile

Advanced

Re: Реализация multiple limit_req

Maxim Dounin
December 14, 2011 11:26AM
Hello!

On Wed, Dec 14, 2011 at 07:39:19PM +0400, Валентин Бартенев wrote:

> On Wednesday 14 December 2011 18:22:26 Maxim Dounin wrote:
> > Давай для начала распишем последствия обычного "последовательного"
> > применения лимитов, чтобы было понятно что так нельзя. Или,
> > наоборот, можно, но с какими ограничениями.
> >
> > Что касается принципа, то он мне не нравится: нам либо нужно всё
> > это делать держа локи (deadlock expected), либо имеем race между
> > проверкой и обновлением (и, опять же, локи придётся брать два
> > раза, что тоже не очень хорошо).
> >
>
> В limit_conn у нас также локи берутся дважды, и тут, на первый взгляд,
> всё можно сделать по тому же принципу.

В limit_conn они второй раз берутся, когда мы откатываем лимиты -
либо по завершению запроса, либо по наступанию на лимит. И race'а
там соответственно нет.

> Опять же, всё упирается в то, хотим ли мы считать отклоненные запросы или
> не хотим.
>
> "Счёт" только еще можно разделить на два уровня:
> - обновление времени последнего запроса;
> - увеличение очереди.
>
> Если мы будем просто последовательно проверять лимиты до первого
> срабатывания, то у нас получается ситуация, когда "иссякший" лимит
> стоящий на втором месте будет работать достаточно странно, имея
> причудливую зависимость от предшествующих.

Это понятно, и именно эти "странности" я и предлагаю
проиллюстрировать на конкретных примерах, чтобы сомнений не
оставалось.

E.g. типичная ситуация для хостинга, когда лимиты хочется на
каждый $host (чтобы один атакуемый сайт не мог съесть все
ресурсы), и на ip (чтобы с одного ip-адреса, вздремнув на ^R,
нельзя было съесть все ресурсы):

limit_req <per-host>;
limit_req <per-ip>;

Если атакуют $host, то всё хорошо.

Если ^R, то проблема: легко "выедается" лимит на $host (хотя
запросы реально не обслуживаются), и тем самым нужный хост
фактически блокируется.

В данном конкретном случае - проблема легко решается сменой
порядка применения лимитов: сначала per-ip, потом per-host.

Вопрос: есть ли в реальной жизни задачи, где проблема так *не*
решается?

(С теоретической точки зрения - понятно, что такие задачи есть.
Интересуют сколько-нибудь относящиеся к реальной жизни примеры.)

> Странность заключается в том, что запросы будут отклоняться, когда
> предшествующие вообще не сработали, и не отклоняться, если предшествующие
> сработали на задержание. Иными словами, меньший rate по предшествующим
> лимитам будет приводить к более суровым мерам.

Вот как раз в примере выше - подобное поведение вполне нормально,
при условии правильного порядка лимитов. Мы хотим пускать людей
на сайт, пока не превышен лимит на этот сайт, и мы хотим отсекать
людей с ^R, чтобы они вообще никому никаких проблем не доставляли.
Т.е. конструкция

limit_req <per-ip>;
limit_req <per-host>;

не должна никак считать в per-host лимит запросы, отклонённые на основании
"ip-адресом не вышел". И в то же время должна считать суммарный
лимит для хоста, и отклонять при необходимости запросы за него
выходящие.

Maxim Dounin

_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru
Subject Author Posted

Реализация multiple limit_req

Валентин Бартенев December 14, 2011 09:06AM

Re: Реализация multiple limit_req

Maxim Dounin December 14, 2011 09:24AM

Re: Реализация multiple limit_req

Валентин Бартенев December 14, 2011 10:40AM

Re: Реализация multiple limit_req

Maxim Dounin December 14, 2011 11:26AM

Re: Реализация multiple limit_req

Валентин Бартенев December 14, 2011 01:00PM

Re: Реализация multiple limit_req

Maxim Dounin December 14, 2011 01:30PM

Re[2]: Реализация multiple limit_req

Михаил Монашёв December 14, 2011 01:56PM

Re: Реализация multiple limit_req

Maxim Dounin December 15, 2011 07:40AM

Re[2]: Реализация multiple limit_req

Михаил Монашёв December 16, 2011 11:10AM

Re[3]: Реализация multiple limit_req

Михаил Монашёв December 16, 2011 11:22AM

Re: Реализация multiple limit_req

Maxim Dounin December 16, 2011 12:06PM

Re: Реализация multiple limit_req

Gena Makhomed December 18, 2011 03:02PM

Re: Реализация multiple limit_req

Maxim Dounin December 19, 2011 03:28AM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 322
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready