Re: Closing connection при медленном скачивании

Maxim Dounin mdounin at mdounin.ru
Tue Dec 18 19:58:18 UTC 2012


Hello!

On Tue, Dec 11, 2012 at 05:00:49PM +0600, klimov.d.e at gmail.com wrote:

> Приветствую!
> 
> Столкнулись с такой проблемой.
> 
> Есть необходимость отдавать большой файл. Клиент получает по http этот
> файл своей системой, в которой установлен лимит на скорость скачивания.
> 
> возникла проблема что клиент через некоторое время получает 
> Closing connection всегда через одно и то же время. Причем это время
> зависит от скорости с которой он скачивает.
> 
> Начали тестировать и выяснили что воспроизводится на простейшем конфиге
> с крайней стабильной версией 1.2.5 и зависит от значения параметра
> send_timeout.
> 
> 
> server {
> send_timeout 15;
> location /export/ {
> 	alias /www/export/;
> }
> 
> }
> 
> в export находится bigfile.xml достаточно большой.
> 
> Проверяется командой 
> 
>  % curl -vvv -H 'Host:
> www.example.ru' http://10.7.17.11/export/yal.xml --limit-rate 60K
> > /dev/null
> 
> * About to connect() to 10.7.17.11 port 80 (#0)
> *   Trying 10.7.176.11...   % Total    % Received % Xferd  Average
> Speed   Time    Time     Time  Current Dload  Upload   Total   Spent
> Left  Speed 0     0    0     0    0     0      0      0 --:--:--
> --:--:-- --:--:--     0connected
> * Connected to 10.7.17.11 (10.7.17.11) port 80 (#0)
> > GET /export/bigfile.xml HTTP/1.1
> > User-Agent: curl/7.21.0 (x86_64-pc-linux-gnu) libcurl/7.21.0
> > OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.15 libssh2/1.2.6 Accept: */*
> > Host: www.example.ru
> > 
> < HTTP/1.1 200 OK
> < Server: nginx/1.2.5
> < Date: Mon, 10 Dec 2012 11:23:13 GMT
> < Content-Type: text/plain
> < Content-Length: 1036786323
> < Last-Modified: Mon, 10 Dec 2012 10:24:03 GMT
> < Connection: keep-alive
> < Accept-Ranges: bytes
> < 
> { [data not shown]
>   0  988M    0 3749k    0     0  60669      0  4:44:49  0:01:03
> 4:43:46 62197* transfer closed with 1032903274 bytes remaining to read
> 0  988M    0 3792k    0     0  61360      0  4:41:36  0:01:03  4:40:33
> 72301* Closing connection #0
> 
> curl: (18) transfer closed with 1032903274 bytes remaining to read
> 
> 
> 
> т.е. обрывается на 0:01:03
> время обрыва каждый раз практически одинаково. Оно увеличивается при
> увеличении параметра send_timeout. При значении в 30 секунд обрывается
> уже на 0:34:57.
> 
> сеть ни причем, воспроизводится также при запуске curl с того же хоста
> где nginx.
> 
> Похоже на баг в nginx или я что то я делаю не так?

Надо смотреть что конкретно происходит на уровне сети и с точки 
зрения nginx'а (== tcpdump + debug log).  Скорее всего проблема 
в том, что подобное ограничение скорости со стороны клиента 
выливается для nginx'а в ничего не читающего более connect_timeout 
секунд клиента.

Почему выливается - отдельный вопрос, с обычным curl'ом из коробки 
такого быть не должно (поизучал код curl'а - он тщательно следит, 
чтобы задержка чтения была ~1s).  Возможно где-то между nginx'ом и 
curl'ом затесался некий дополнительный проксирующий слой (ещё один 
nginx? антивирус?), из-за которого такое поведение и получается.


-- 
Maxim Dounin
http://nginx.com/support.html



Подробная информация о списке рассылки nginx-ru