Отловить момент, когда закачка завершена

Igor Sysoev is at rambler-co.ru
Fri Feb 10 10:36:45 MSK 2006


On Fri, 10 Feb 2006, AleXXX V. NovikoFF wrote:

>>> On Thu, 9 Feb 2006, AleXXX V. NovikoFF wrote:
>>>
>>>>> Когда файл отдается целиком, post_action действительно вызывается, а
>>>>> когда вот такое:
>>>>>
>>>>> 2006/02/09 08:21:30 [info] 2679#0: *2430 client timed out (110: Connection timed out) while sending response to client, client: 21
>>>>> 2.220.204.71, server: mults.spb.ru, URL: "/mults/gribnoy_dozhdik.avi",
>>>>> host:,0 "mults.spb.ru", referrer: http://mults.spb.ru/mults/"
>>>>>
>>>>> то до post_action дело не доходит, а надо бы... :(
>>>>>
>>>>
>>>> Может попробовать вынести обработку post_action в функцию ngx_http_close_request?
>>>
>>> Нет, post_action нужно вызывать в ngx_http_finalize_request().
>>
>> Там есть такие моменты, когда в ngx_http_finalize_request() мы никогда
>> не попадем, среди них как раз connection timeout :( я заметил как
>> минимум в 2 местах (искать по словам "client timed out")

Есть.

>>> Для оборванных ответов вызов post_action можно поставить сюда:
>>>
>>>      if (rc == NGX_ERROR || r->connection->error) {
>>>          ngx_http_close_request(r, 0);
>>>          return;
>>>      }
>>
>> испробовано, ноль реакции,
>> пробовал также в ngx_http_writer() но в итоге тоже, реакции нет...
>>
>>>
>>> Но нужно смотреть, возможно, при обработка проксированных и fastcgi
>>> запросов будет не полной из-за r->connection->error.
>>
>> у меня в общем-то этот post_action в выдаче статики участвует

Но обработчик post_action - это проксированный запрос ? Вот там-то и могут
быть проблемы.

> Вот в общем дебаговый лог:
>
> .... тут качалось много....
> 2006/02/10 08:00:54 [debug] 20044#0: *15 post event 080D59FC
> 2006/02/10 08:00:54 [debug] 20044#0: *15 delete posted event 080D59FC
> 2006/02/10 08:00:54 [debug] 20044#0: *15 http upstream check client, write event:0, "/mult_ftp/mults/gribnoy_dozhdik.avi"
> 2006/02/10 08:01:53 [debug] 20044#0: *15 event timer del: 14: 1381380149
> 2006/02/10 08:01:53 [debug] 20044#0: *15 http writer handler: "/mult_ftp/mults/gribnoy_dozhdik.avi?1443422"
> 2006/02/10 08:01:53 [info] 20044#0: *15 client timed out (110: Connection timed out) while sending response to client, client: 212.220.204.71, server:
> mults....
> 2006/02/10 08:01:53 [debug] 20044#0: *15 http close request
> 2006/02/10 08:01:53 [debug] 20044#0: *15 http log handler
> 2006/02/10 08:01:53 [debug] 20044#0: *15 malloc: 080AF6C0:4096
> 2006/02/10 08:01:53 [debug] 20044#0: *15 run cleanup: 080AF380, fd:15
> 2006/02/10 08:01:53 [debug] 20044#0: *15 free: 080EF908
> 2006/02/10 08:01:53 [debug] 20044#0: *15 free: 080AE6B8, unused: 108
> 2006/02/10 08:01:53 [debug] 20044#0: *15 free: 080AF6C0, unused: 3867
> 2006/02/10 08:01:53 [debug] 20044#0: *15 close http connection: 14
> 2006/02/10 08:01:53 [debug] 20044#0: *15 free: 080AE050
> 2006/02/10 08:01:53 [debug] 20044#0: *15 free: 080AE2B0
> 2006/02/10 08:01:53 [debug] 20044#0: *15 free: 080ADF48, unused: 68
>
> Тут же и видно, что по таймауту в ngx_http_finalize_request() мы не
> попадаем :( как быть?

В том месте можно вызывать ngx_http_finalize_request().
В общем, нужно смотреть все места, откуда в нужно вызывать post_action.
Но ngx_http_close_request() - это не то место, где нужно вызывать
post_action.


Игорь Сысоев
http://sysoev.ru





More information about the nginx-ru mailing list