ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Поддержка Range в subrequest


  • To: nginx-ru@xxxxxxxxx
  • Subject: Поддержка Range в subrequest
  • From: "akashihi" <nginx-forum@xxxxxxxx>
  • Date: Wed, 22 Jan 2014 03:45:23 -0500
  • Dkim-signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=selenium.jlkhosting.com; s=x; h=Date:Sender:From:Message-ID:Content-Transfer-Encoding:Content-Type:Subject:To; bh=nIXle11fgsRQ4zWSiP6E82wM06XJQsE1OlORTSpOHCw=; b=goFZJP+L1NYS8yP02Fak2mYFBUlmo6NWUxDfid1lT0gvWCY8RETt+GCy/uNUnyc+NKeC/gLrAA9DDgU4U8qw2Rmfm/1SMN24EFh+n76T6JkWCdJrOSzMi8hm3n6W0GN91+eabxmgc2W58Zk1vJL80XTDM0PxbH1GiT/b2dAUgWo=;

Добрый день.



Разбирался с одной проблемой производительности и обнаружил, что nginx не
умеет читать части файлов (то есть не поддерживает range) в subrequest'ах. 

Например, если запрашивать файл напрямую, то читается только запрошенный
участок файла:
 curl  --header "Range: bytes=20000-21000"
http://localhost:8081/largefile.txt
open("/home/...../largefile.txt", O_RDONLY|O_NONBLOCK) = 13
fstat(13, {st_mode=S_IFREG|0644, st_size=10485760, ...}) = 0
pread(13,
"G\2220cT+>\214r\0056\321#\202k\6\215\36\214\32\34X\267\350\302r\242\275\311\6\203f"...,
1001, 20000) = 1001

Но, если я обращаюсь к файлу из модуля с помощью subrequest, то читается
всегда весь файл:
 curl  --header "Range: bytes=20000-21000"
http://localhost:8081/subrequest.txt
open("/home/.../largefile.txt", O_RDONLY|O_NONBLOCK) = 13
fstat(13, {st_mode=S_IFREG|0644, st_size=10485760, ...}) = 0
pread(13,
"\210\336\212k3\355g\nOH\"0\20\3152\265\v4\25\253\21\2U/\234!\257\331Uh\350\245"...,
32768, 0) = 32768
pread(13,
"\32\310\270>\245K\21\271\230\235\230\345\35]=\266@q\373}\204\367.\352\355i\224\215d\200\322\37"...,
32768, 32768) 
итд


В коде ngx_http_range_filter_module есть явная проверка, не subrequest ли
обрабатывается и если да, то передаётся следующему фильтру:
    if (r->http_version < NGX_HTTP_VERSION_10
        || r->headers_out.status != NGX_HTTP_OK
        || r != r->main
        || r->headers_out.content_length_n == -1
        || !r->allow_ranges)
    {
        return ngx_http_next_header_filter(r);
    }


То есть это не баг, а осознанное решение. Но вот чем оно вызвано? Беглое
чтение кода не прояснило ничего.

Posted at Nginx Forum: 
http://forum.nginx.org/read.php?21,246681,246681#msg-246681

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


 




Copyright © Lexa Software, 1996-2009.