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

Maxim Dounin mdounin at mdounin.ru
Fri Mar 27 22:03:11 MSK 2009


Hello!

On Fri, Mar 27, 2009 at 06:48:54PM +0100, Sergey Bondari wrote:

> Hello Maxim,
> 
> Вот отладочный лог. Реквест *12 сперва получает задержку от limit_req
> а потом падает по client timed out при попытке послать ответ.

Патч:

diff --git a/src/http/modules/ngx_http_limit_req_module.c b/src/http/modules/ngx_http_limit_req_module.c
--- a/src/http/modules/ngx_http_limit_req_module.c
+++ b/src/http/modules/ngx_http_limit_req_module.c
@@ -262,6 +262,8 @@ ngx_http_limit_req_delay(ngx_http_reques
     ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
                   "limit_req delay");

+    r->connection->write->timedout = 0;
+
     if (ngx_handle_read_event(r->connection->read, 0) != NGX_OK) {
         ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
         return;

Maxim Dounin

> 
> 
> 
> 
> >> Hello nginx-ru,
> >> 
> >>       При включении limit_req nginx 0.7.43 и 0.7.38 (на других не
> >>       тестировалось) внештатно обрывает соединение с клиентом.
> >> 
> >>       Установлено на 30 реквестов за 60 секунд.
> >> 
> >>       В приложении отладочные логи, TCP логи из Wireshark, терминал
> >>       логи.
> 
> 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
> 
> 
> 
> 
> -- 
> Best regards,
>  Sergey






More information about the nginx-ru mailing list