2013-12-23 6 views
5

私は新しい音楽アプリケーションを作成しました。私はAmazon S3にすべてのmp3ファイルを保存しています。 S3に移行する前に、私はそれらをサーバーファイルシステム自体に保存していました。これはファイルのキャッシュに使用され、ページファイルの連続したリロードではサーバーからダウンロードされませんでした。しかし、私がページを読み込むたびにS3に移動した後、S3からファイルをダウンロードします。これは私のアプリケーションを遅くするだけでなく、S3へのすべてのリクエストはお金です。 私はキャッシュコントロールに関するいくつかのドキュメントを見つけましたが、私はそれらをすべて試しましたが、成功しませんでした。私はここで何かを逃しているかもしれない。どんな助けもありがとうございます。ありがとう。Amazon S3キャッシュオーディオファイル

ここでは、S3でmp3ファイルをアップロードするためのコードです。私はCarriersWave with Railsを使用します。

CarrierWave.configure do |config| 
    config.fog_credentials = { 
     :provider    => 'AWS', 
     :aws_access_key_id  => MyAppConfig.config['aws']['aws_access_key'], 
     :aws_secret_access_key => MyAppConfig.config['aws']['aws_secret_key'], 
    } 
    config.fog_directory = MyAppConfig.config['aws']['aws_bucket_name'] 
    config.fog_public  = false 
    config.storage = :fog 
    config.fog_attributes = {'Cache-Control'=>'max-age=315576000'} 
end 
+0

"それ"はS3からファイルをダウンロードします... "それは何ですか?"ブラウザ?またはサーバーですか? S3をファイルシステムとして使用しようとしていますか? –

+0

"it" = "browser"。 – pramodtech

+0

署名済みのURLを使用していますか? –

答えて

3

あなたがコメントに記載されていると言う署名入りのURLを使用している場合は、これらの署名済みURLを再利用しないで、を再利用しないと、これらの要求をキャッシュする方法はありません。

Amazon Webサービスは、Webブラウザの内部キャッシュシステムを上書きすることはできません。 2つのURIが署名されたURLのように一意である場合、Webブラウザはそれらをインターネット上の2つの異なるリソースとして扱います。

たとえば、のは、みましょう:これらは、2つの別々のURIが

http://www.example.com/song1.mp3 
http://www.example.com/song2.mp3 

です。 song1.mp3song2.mp3に同じHTTP応答ヘッダーがある場合でも、それらはまだ2つの異なるリソースです。

http://www.example.com/song1.mp3?a=1&b=2&c=3 
http://www.example.com/song1.mp3?a=1&b=2&c=4 

これらはまだ 2つの個別のURI をしている:我々は単に彼らのクエリ文字列を変更した場合

も同様です。彼らはキャッシュの目的のためにお互いを参照しません。これはquery strings to override cachingを使用する背後にある原則です。

HTTPヘッダーに手を加えても、探しているキャッシュの動作が得られません。

+0

あなたが署名付きURLと署名なしURLの理解を助けることができれば、おそらく私はあなたが自分の問題を解決するはずの署名のないURLに行くことができるかどうかを決めることができます。 – pramodtech

+0

AWSで署名されたURLは '/song1.mp3?Expires = 123&Signature = abc'のように見え、オンデマンドで生成されます。要求ごとに署名されたURLを作成している場合、そのURLは誰にもキャッシュされません。オブジェクトをキャッシュするには2つの方法があります:1)オブジェクトの読み取りポリシーを 'public'にして、誰もが'/song1.mp3'を使ってクエリ文字列なしでアクセスできるようにする、2)署名されたURLを保存して管理するシステムを作成する同じユーザは同じ正確な署名されたURL '/song1.mp3?Expires = 123&Signature = abc'を複数回(はるかに大きな仕事)見ています。 –

2

更新メタデータを使用してS3にすでにアップロードされたファイルのためのhttp://www.bucketexplorer.com/documentation/amazon-s3--how-to-set-cache-control-header-for-s3-object.html

セットのCache-Controlを見てみましょう:)

1を実行バケツエクスプローラとあなたの資格情報でログインします。

2)すべてのバケットをリストしたら、任意のS3バケットを選択します。

3)選択したS3バケットのすべてのオブジェクトが一覧表示されます。

4)ファイルを選択してオブジェクトを右クリックし、[メタデータの更新]オプションを選択します。

5)メタデータ属性にキーと値を追加します。 Enterキー:値が「Cache-Control」である場合:「max-age =(オブジェクトからキャッシュにアクセスする時間(秒))」

6)[保存]ボタンをクリックします。選択したすべてのS3オブジェクトのメタデータがCache-Controlとして更新されます。

Example to set max-age: For time limit of 15 days = 3600 * 24 * 15 = 1296000 sec. Set Key = “Cache-Control” value = “max-age=1296000” 

注:「のCache-Control」および値::オブジェクトは、HTMLのキー設定ファイルであれば、最大エージング=(あなたのオブジェクトは、秒単位でキャッシュからアクセスすることにしたい時間)、なければなりません-revalidate "すなわちキー: "Cache-Control"の値:max-age = "2592000、30日間再検証する必要があります" 「再検証する必要があります」という文字列は、値として秒後に追加する必要があります。

1

キャッシュコントロールヘッダーを適切に設定し、署名付きURLを使用していると仮定すると、指定されたファイルの署名付きURLを保持し、その後のページ読み込みでまったく同じURLを再描画する必要があります。

キャッシュ制御ヘッダーを設定していない場合、または要求を行ったユーザーに基づいて変更する場合は、&response-cache-control=valueまたは&response-expires=valueを使用してURLに署名する前に設定できます。