проблема с limit_req - client timed out

Maxim Dounin mdounin at mdounin.ru
Thu Mar 26 16:47:46 MSK 2009


Hello!

On Thu, Mar 26, 2009 at 01:54:33PM +0100, Sergey Bondari wrote:

> Hello Maxim,
> 
> MD> В приложении нет отладочных логов, для получения отладочных логов
> MD> необходимо пересобрать nginx, указав ./configure ключ 
> MD> --with-debug.  В логе должны появится строки с '[debug]'.
> 
> MD> Судя по
> 
> MD> 2009/03/25 14:21:55 [warn] 28837#0: *17 delaying request, excess: 0.999, by zone "spire", client: 82.208.43.89, server: www.tanita.com, request: "GET /en/ HTTP/1.0", host: "www.tanita.com"
> MD> 2009/03/25 14:21:56 [info] 28837#0: *15 client 82.208.43.89 closed keepalive connection
> MD> 2009/03/25 14:21:57 [info] 28837#0: *17 client timed out (110: Connection timed out) while sending to client, client: 82.208.43.89, server: www.tanita.com, request: "GET /en/ HTTP/1.0", upstream:
> MD> "http://192.168.1.169:80/en/", host: "www.tanita.com"
> 
> MD> срабатывает таймаут на отправку данных клиенту.  Возможно он 
> MD> слишком мал, и задержка от limit_req приводит к этому.
> 
> MD> Если вы хотите только отсекать запросы сверх определённой частоты, 
> MD> но не заставлять клиентов ждать - используйте limit_req ... 
> MD> nowait.
> 
> MD> И не забывайте, что задание limit_req без указания burst смысла не 
> MD> имеет.
> 
> MD> Maxim Dounin
> 
> 1) эти логи высыпались с настройкой debug_http

Как я написал выше, этого недостаточно для получения отладочных 
логов.

> 2) burst стоит 10
> 3) хочу чтобы клиенты НЕ отсекались а просто вели себя прилично (= не
> более 1 запроса за 2 секунды к бэкенду)

Вопрос исключительно в том, что вы предпочитаете делать с теми, 
кто ведёт себе неприлично.  С текущими настройками их запросы 
будут задерживаться вплоть до 10 секунд (до превышения burst), 
после чего начнут отсекаться.  При использовании nowait - они 
будут обслуживаться нормально до превышения burst, после чего 
опять же начнут отсекаться.

> 4) все таймоуты что вижу в настройках стоят минимально на 60 секунд, а
> тут речь даже не о секунде.

Судя по всему, таймаут на запись сохраняется от задержки, 
используемой limit_req.  Workaround - попробовать использовать 
nowait.

Надо смотреть на limit_req подробнее (там не только эта проблема, 
да и возможность использования нескольких лимитов одновременно 
давно пора сделать).  Но у меня времени нет, и у Игоря видимо 
тоже.

Maxim Dounin





More information about the nginx-ru mailing list