Hello!

On Fri, Apr 17, 2015 at 09:15:21AM -0400, dwow wrote:

> Maxim Dounin Wrote:
> -------------------------------------------------------
>  
> > Just a side note: не надо делать так, вместо этого правильно 
> > написать отдельный location, в котором и задать ограничение.
> 
> вот это я не понял.
> 
> у меня так
> location /services/post/ {
>    limit_conn perservice 1;
>    proxy_pass bakcend;
> }

Тогда зачем у вас используется perl_set?

Если limit_conn в других location'ах не включён, то для 
ограничения всех соединений в конкретном location'е - достаточно 
любого константного значения.

> > Скорее всего проблема в том, что limit_conn органичивает не 
> > соединения на бекенду, а активные соединения.  Соответственно, 
> > если кто-то сходил на бекенд, получил оттуда достаточно большой 
> > ответ и неспеша забирает его у nginx'а - ограничение будет 
> > продолжать срабатывать.  Например, если клиент сделал запрос 
> > (ответ на который не помещается в буфер сокета), после чего пропал 
> > и на пакеты не отвечает - ограничение будет срабатывать, пока не 
> > случится send_timeout.
> 
> Ага, и тогда через  send_timeout (default: 60s), счетчик должен
> декрементироваться и следующий запрос пойти на бекенд, так? Но этого не
> происходит(

Если send_timeout случится - то да.  Если же вдруг какой-то клиент 
очерь медленно качает что-то большое - то процесс может занять 
бесконечное время.

Ну и да, безусловно имеет смысл заглянуть в error log, и убедится, 
что рабочие процессы не завершаются аварийно.

-- 
Maxim Dounin
http://nginx.org/

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

Ответить