mp4 pseudostreaming with proxy_pass and slice

Anatoliy Korostelevm, NGENIX a.korostelev на ngenix.net
Пт Мар 18 07:53:34 UTC 2016


Здравствуйте!

Меня интересует возможность nginx, позволяющая проксировать запросы на 
mp4 к бекэнду, чтобы при этом не было необходимости выкачивать на бекэнд 
весь mp4 (файл может быть очень большим), а было лишь достаточно послать 
range-запрос на необходимые данные, их закешировать и отдавать клиенту. 
Для тестирования данной возможности я создал следующую конфигурацию 
(привожу кусок):

location / {
         proxy_pass http://someIP$uri;

         proxy_set_header  Host              example.net
         proxy_set_header  X-Real-IP        $remote_addr;
         proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_http_version 1.1;

         slice 1m;
         proxy_set_header        Range   $slice_range;
         proxy_cache_valid       200 206 1d;
         proxy_cache     irlem;
         proxy_cache_key $uri$slice_range;
}

Все работает как и запланировано - если я шлю с клиента на nginx 
Range-запрос, nginx и клиент получат необходимую часть данных, 
выравненных по размеру slice. Однако, хотелось бы получать порцию 
необходимых данных. использую не только Range-запросы, но и явно 
указывая в URI момент начала (и возможно конца)  видео. Например, чтобы 
при запросе к nginx вида http://mynginx.server/test.mp4?start=40 
хотелось бы что nginx преобразовывал start=40 в соответствующий 
Range-запрос к бэкенду и выкачивал только необходимые данные. Я добавил 
в конфигурацию своего location параметр mp4 для этого, однако, как 
выяснилось, mp4 не совместим с proxy_pass. Подскажите, кто-то 
реализовывал на nginx что-то подобное, и если реализовал то как? Или 
единственный путь, это писать данную возможность самому (на lua, 
ngscript, своим модулем, etc)?

С уважением,
Коростелев Анатолий



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