не работает flv при X-Accel-Redirect на location с proxy_pass Re: nginx и Amazon S3

Igor Sysoev is at rambler-co.ru
Thu Nov 8 17:20:21 MSK 2007


On Thu, Nov 08, 2007 at 02:50:00PM +0200, Andrey Gerzhov wrote:

> 	Спасибо большое, решил по-вашему рецепту. Но поломался стриминг флешек,
> хотя даже get с докачкой работает.
> 
> 	Схема следующая. nginx.conf:
> [---]
> location /stream/ {
> 	fastcgi_pass  unix:/tmp/perl_cgi-dispatch.sock;
> }
> location /s3-pass/ {
> 	internal;
> 	flv;
> 	proxy_pass              http://XXX.s3.amazonaws.com/;
> 	proxy_buffering		off;
> }
> [---]
> 
> unix:/tmp/perl_cgi-dispatch.sock возвращает строку:
> 
> X-Accel-Redirect: /s3-pass/11900.flv?AWSAccessKeyId=KV0T6W8GJART3BJ82&Signature=UzUYx7luqwwPDEeFKKi%2FIdZQFO0%3D&Expires=1194462843
> 
> или с параметром start= для оффсета по флешке
> 
> X-Accel-Redirect: /s3-pass/11900.flv?AWSAccessKeyId=KV0T6W8GJART3BJ82&Signature=UzUYx7luqwwPDEeFKKi%2FIdZQFO0%3D&Expires=1194462843&start=2443192
> 
> 	Скорее всего в данном случае не вызывается модуль flv или ему не
> передаётся параметр start= . nginx с flv точно собран.
> 
> 	Если указать flv в location /stream/ , то выдаёт 404 потому как
> сразу пытается брать файлы по documentroot.
> 
> 	Господа, как быть ?

nginx поддреживает flv только с диска. Это не фильтр.

> On Mon, Nov 05, 2007 at 08:58:57PM +0000, David Mzareulyan wrote:
> > Зависит от прочей архитектуры Вашего проекта. Во-первых, если контент не 
> > секретный, то, как уже было сказано, ему ключи и не нужны. Если же контент 
> > закрытый, то я, например, использую авторизацию по query-string. А именно: 
> > перехватываю обращение, при помощи PHP формирую адрес типа 
> > /s3-pass/bucket/file?AWSAccessKeyId=... (с нужными параметрами авторизации) 
> > и делаю X-Accel-Redirect на него. А /s3-pass обрабатывается как:
> > 
> > location /s3-pass/ {
> >    internal;
> >    proxy_set_header        Authorization "";
> >    proxy_pass      http://s3.amazonaws.com/;
> >    proxy_buffering off;
> > }
> > 
> > proxy_set_header        Authorization ""; -- потому что у меня самого на 
> > сайте используется хедер "Authorization".
> > 
> > 
> > 
> > >День добрый.
> > >
> > >Хочется поставить nginx фронтендом к Amazon S3 , чтобы стримить им
> > >флешки.
> > >
> > >Доступ к файлам на S3 можно получить через http get, но в
> > >http-запросе
> > >должен присутствовать header Authorization , который является
> > >"HMAC-SHA1 hash of your request using your AWS Secret Access Key.".
> > >Он уникальный для каждого запроса, его нужно сгенерировать, добавить и
> > >сделать proxy_pass и flv дальше.
> > >Пример создания запроса из Net::Amazon::S3 :
> > >
> > >[...]
> > >my $canonical_string
> > >= $self->_canonical_string( $method, $path, $headers );
> > >my $encoded_canonical
> > >= $self->_encode( $aws_secret_access_key, $canonical_string );
> > >$headers->header(
> > >Authorization => "AWS $aws_access_key_id:$encoded_canonical"
> > >);
> > >[...]
> > ># finds the hmac-sha1 hash of the canonical string and the aws secret
> > >access key and then
> > ># base64 encodes the result (optionally urlencoding after that).
> > >sub _encode {
> > >my ( $self, $aws_secret_access_key, $str, $urlencode ) = @_;
> > >my $hmac = Digest::HMAC_SHA1->new($aws_secret_access_key);
> > >$hmac->add($str);
> > >my $b64 = encode_base64( $hmac->digest, '' );
> > >if ($urlencode) {
> > >return $self->_urlencode($b64);
> > >} else {
> > >return $b64;
> > >}
> > >}
> > >[...]
> > >
> > >В какую сторону копать для решения этой задачи ?
> > >
> > >Если http_perl_module, то как ему передать все headers ?
> > >
> > >P.S.
> > >http://docs.amazonwebservices.com/AmazonS3/2006-03-01/gsg/reading-an-o
> > >bject.html
> > >
> > 
> > 
> > -- 
> > С уважением
> > Давид Мзареулян
> > david at hiero.ru
> > 
> > 
> > 
> 
> -- 
>                                                Kittle 
> 

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





More information about the nginx-ru mailing list