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

Andrey Gerzhov nginx-ru at kittle.humgat.org
Thu Nov 8 15:50:00 MSK 2007


	Спасибо большое, решил по-вашему рецепту. Но поломался стриминг флешек,
хотя даже 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.

	Господа, как быть ?

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 





More information about the nginx-ru mailing list