Ограничение соединений с backend

Kirill A. Korinskiy catap+nginx at catap.ru
Mon Jun 15 13:53:01 MSD 2009


At Mon, 15 Jun 2009 13:33:26 +0400,
Vladimir Latyshev <latysheff at gmail.com> wrote:
> 
> [1  <text/plain; KOI8-R (base64)>]
> 
> [2  <text/html; KOI8-R (base64)>]
> В архиве нашел подобную тему, но решение неясно.
> 
> Как известно, apach'у плохеет при большом количестве соединений. Предположим, нагрузочным
> тестированием выявлено, что некий сервис на apache+php тянет 100 одновременных обращений,
> а при большей нагрузке - ложится. MaxClients ставим на сотню, но лишние соединения все
> равно приходят, висят в очереди (ListenBacklog), и де-факто получаем для всех 100%
> клиентов слишком долгое ожидание. Как побороть это в апаче - так и не придумал. Хочется
> сделать так, чтобы те, кому "повезло" получали ответ быстро сразу, а остальные - вежливый
> отлуп (еще быстрее, хехе).
> 
> Возможно ли с помощью nginx ограничить глобально число активных соединений с бэкэндом при
> использовании директивы proxy_pass, а всем "лишним" выдавать некую статику?
> Можно попробовать выкрутиться так:
> 
> limit_zone conn $myvar 100k;
> set $myvar 1; # константа, то есть ограничение для всех (глобально)
> limit_conn conn 100;
> error_page  503 =200 /sorry.html;
> 
> Но этот вариант не устраивает, так как медленные соединения заблокируют доступ остальным,
> а апач будет по сути простаивать.
> Что еще можно придумать? Подозреваю, что я не первый задаюсь этим вопросом и решение уже
> существует :)
> 

если apache и nginx на одной машине, то можно взять в руки:
http://catap.ru/blog/2009/05/29/nginx-loadavg_-and-more-or-less-in-if/

И сделать, что-то типо:

if ($loadavg_1m > 5) {
    return 503;
}


-- 
wbr, Kirill





More information about the nginx-ru mailing list