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