Re: Обход ограничений limit conn

Maxim Dounin mdounin at mdounin.ru
Sun Jul 7 21:50:13 UTC 2013


Hello!

On Sun, Jul 07, 2013 at 01:43:34PM -0400, Antohat wrote:

> Уважаемые разработчики!
> 
> Мы используем на сайте ограничение на количество одновременных соединений с
> одного IP со следующим конфигом:
> 
> limit_conn_zone $binary_remote_addr zone=addr:64m;
> limit_conn addr 20;
> limit_conn_log_level warn;
> 
> Все работало отлично, но некоторое время назад мы с удивлением обнаружили,
> что бекенд обрабатывает более 500 запросов с одного IP.
> В результате анализа выяснилось, что какой-то смышленный малый создает
> большое количество соединений и сразу же их рвет. В результате nginx
> успевает передать запрос на бекенд, но т.к. пользователь сразу же рвет
> соединение и создает новые, то ограничение на количество запросов не
> срабатывает.
> 
> Я понимаю, что с точки зрения nginx тут все чисто, т.к. он считает только
> открытые соединения со стороны клиента, но если подумать, то limit_conn все
> таки используется администраторами как средство ограничения кол-ва
> одновременных запросов на бекенд, т.к. большое кол-во запросов на к самому
> Nginx совсем не проблема.
> 
> Не могли бы вы реализовать ограничение количества одновременных запросов с
> одного IP на бекенд, т.к. текущий функционал limit_conn тут не помогает?

С точки зрения nginx'а - никаких запросов уже нет вообще, т.к. 
вслед за закрытием соединения клиентом - он закрывает соединение с 
бекендом и полностью завершает обработку запроса.

Если у вас бекенд не достаточно умный, чтобы понять, что с 
закрытым соединением уже ничего делать не нужно - то можно 
включить proxy_ignore_client_abort:

http://nginx.org/r/proxy_ignore_client_abort

В этом случае nginx будет дожидаться, чтобы бекенд доработал, и 
только после этого завершать обработку запроса (и соответственно 
уменьшать счётчик активных соединений).

-- 
Maxim Dounin
http://nginx.org/en/donation.html



Подробная информация о списке рассылки nginx-ru