さくらBASEストレージに格納した音声ファイルをnginxで配信する方法
まずは、勉強せねば・・
nginxのリバースプロキシの設定がよくわからないなぁ。とりあえず、 下記を参照しながら、いろいろと試行錯誤。
http://heartbeats.jp/hbblog/2012/04/nginx05.html
location ~ /audio/(.*) { proxy_pass http://hoge.b.storage.sakura.ad.jp/$1; }
そして、アクセスしたら
no resolver defined to resolve hoge.b.storage.sakura.ad.jp
設定が足りないのかもしれない resolverディレクティブをつければという記述を発見。
http://stackoverflow.com/questions/15556023/nginx-variables-cname-in-proxy-pass
つけてみたら、エラーが変わった。
BASE ストレージのURLはHTTPSなので、HTTPでごまかそうとしたのが、やはりNGに理由かも。
NGINXの設定をフロントHTTP,バックHTTPSにしないといけないのですが、nginxのドキュメントにもあるのでできるはず・・・
ただ単にnginxをビルドするときにHTTPSを使えるようにする オプションを忘れていただけのような気がしてきた・・・
Nginxをソースからコンパイル&インストール - Qiita
ssiモジュールは使いたいので、
$ ./configure --prefix=/usr/local/nginx --with-http_ssl_module --without-http_uwsgi_module --with-http_realip_module
下記で、確認できるようなので確認してみよう。
nginx -V
hiroseさんの設定をいただきながら再度nginxの設定をしてみよう。
あと、キャッシュも有効にしたいのでキャッシュの方法も調べる。
Nginx - リバースプロキシキャッシュ設定(基本的)! - mk-mode BLOG
# httpディレクティブにcache-spaceというキーゾーン名でキャッシュ定義されている前提 server{ location /audio/ { resolver 127.0.0.1; set $api_backend "hoge.b.storage.sakura.ad.jp"; proxy_pass https://$api_backend; proxy_ignore_headers Cache-Control; proxy_cache cache-space; proxy_cache_valid 200 302 60m; proxy_cache_valid 404 10m; }
うーん。nginxから500が返る。debugログを出すようにしてでも、debugレベルのログはでていないなぁ。info,noticeだけだぁ。
以下の定義を入れても、NG http://stackoverflow.com/questions/4804822/client-closed-prematurely-connection-while-sending-to-client-in-nginx
とりあえず、追えないのでdebugログが出力されるようにビルドしなおさないと (--with-debug)
どうも、HTTP1.0でnginxからさくらに対してリクエストが飛んでいるような感じでした。
curlで試してみたら、エラーになった。
curl --http1.0 http://hoge.b.storage.sakura.ad.jp/1.mp3 <?xml version="1.0" encoding="UTF-8"?> <Error><Code>InternalError</Code><Message>We encountered an internal error. Please try again.</Message><RequestId></RequestId><Resource></Resource></Error>
解決!HTTPバージョンを指定するようにしたらアクセスできるようになりました。 それt、Authorizationヘッダの指定も追加してみました。
# httpディレクティブにcache-spaceというキーゾーン名でキャッシュ定義されている前提 # ssiをonにすると$date_gmtが使用できるようになる location ~ /audio/(.*) { ssi on; resolver 8.8.8.8; set $username "hoge_ro"; set $token "hoge_ro_token_valule"; set $api_backend "hoge.b.storage.sakura.ad.jp"; proxy_pass https://hoge.b.storage.sakura.ad.jp:443/$1; proxy_pass_request_headers off; proxy_set_header Authorization $username:$token; proxy_http_version 1.1; # proxy_set_header Date $date_gmt; proxy_set_header Date $date_local; proxy_set_header Expires 10m; proxy_set_header Accept */*; proxy_ignore_headers Cache-Control; proxy_cache cache-space; proxy_cache_valid 200 302 60m; proxy_cache_valid 404 10m; }
追記
何回かうまく動作したのですが、リターンコード500が返るようになってうまくできなくなってしまいました。さくらBASEストレージのフィードバックで報告しました。
認証周りが怪しいな。
以下のようにAuthorizationにべたで書いてるのがまずいのかな?
proxy_set_header Authorization $username:$token;
まずは、こちらをみると、どうも認証するときほげほげしている。 要するに、privateにすると認証する方法が変わるということか。
できたぞぉー
やり方、公開してくれてて、ありがとうございます。 できました。
# you must configure nginx with ngx_aws_auth module!! location /audio/ { resolver 8.8.8.8; proxy_pass https://your_bucket.b.storage.sakura.ad.jp:443/; proxy_pass_request_headers off; proxy_http_version 1.1; aws_access_key hoge_ro; aws_secret_key hoge_token_value; s3_bucket your_bucket; chop_prefix /audio; proxy_set_header Authorization $s3_auth_token; proxy_set_header x-amz-date $aws_date; proxy_set_header Accept */*; proxy_ignore_headers Cache-Control; proxy_cache cache-space; proxy_cache_valid 200 302 60m; proxy_cache_valid 404 10m; }