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

Igor Sysoev igor at sysoev.ru
Wed Jan 22 08:55:41 UTC 2014


On Jan 22, 2014, at 12:45 , akashihi wrote:

> Добрый день.
> 
> 
> 
> Разбирался с одной проблемой производительности и обнаружил, что 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 at 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);
>    }
> 
> 
> То есть это не баг, а осознанное решение. Но вот чем оно вызвано? Беглое
> чтение кода не прояснило ничего.

Подзапросы делались прежде всего для включений SSI, к которым ranges не применимы.


-- 
Igor Sysoev
http://nginx.com




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