鈍足ランナーのIT日記

走るのが好きな5流のITエンジニアのブログ。

趣味の範囲は広いけど、どれも中途半端なクソブロガー楽しめるWebアプリを作ってあっと言わせたい。サーバーサイドPerl(Mojolicious)、クライアントサイドVue.js。Arduinoにも触手を伸ばす予定。

さくら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にすると認証する方法が変わるということか。

NginxでREST認証してS3へリバースプロキシー

できたぞぉー

やり方、公開してくれてて、ありがとうございます。 できました。

# 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;
        }