Ограничение соединений с 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