Amazon S3缓存音频文件

时间:2013-12-23 11:49:53

标签: ruby-on-rails caching amazon-web-services amazon-s3

我创建了新的音乐应用程序,并将所有mp3文件存储在Amazon S3上。在转移到S3之前,我将它们存储在服务器文件系统本身上。它用于缓存文件,并且连续重新加载的页面文件未从服务器下载。但是每次加载页面后转到S3都会从S3下载文件。这不仅使我的应用程序变慢,而且对S3的每个请求都是金钱。 我找到了一些关于缓存控制的文档,我尝试了所有这些但没有成功。我可能会在这里遗漏一些东西。任何帮助表示赞赏。感谢。

这是我在S3上上传mp3文件的代码。我使用CarrierWave和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

3 个答案:

答案 0 :(得分:3)

如果您使用的是签名网址,即表示您在评论中而不是重复使用这些已签名的网址,则无法缓存这些请求。

Amazon Web Services无法覆盖您的Web浏览器的内部缓存系统。当两个URI是唯一的,因为它们与签名URL一样,那么您的Web浏览器会将它们视为Internet上的两个不同资源。

例如,让我们采取:

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

这是两个离散的URI。即使song1.mp3song2.mp3具有相同的EtagContent-Length HTTP响应标头,它们仍然是两个不同的资源。

如果我们只改变他们的查询字符串,情况也是如此:

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

这些仍然是两个离散的URI。出于缓存的目的,他们不会互相引用。这是使用query strings to override caching背后的原则。

无法摆弄HTTP标头,无法获得您正在寻求的缓存行为。

答案 1 :(得分:2)

查看http://www.bucketexplorer.com/documentation/amazon-s3--how-to-set-cache-control-header-for-s3-object.html

使用更新元数据为S3上已经上传的文件设置缓存控制:

1)运行Bucket Explorer并使用您的凭据登录。

2)列出所有Buckets后,选择任何S3 Bucket。

3)它将列出所选S3 Bucket的所有对象。

4)选择任何文件并右键单击对象,然后选择“更新元数据”选项。

5)在元数据属性中添加键和值。输入密钥:“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”

注意:如果对象是HTML文件,请设置密钥:“Cache-Control”和值:max-age =(您希望以秒为单位从缓存访问对象的时间),必须重新验证“即密钥:“缓存控制”值:max-age =“2592000,必须重新验证”30天。 “必须重新验证”字符串必须在第二个时间后添加为值。

答案 2 :(得分:1)

假设您已正确设置缓存控制标头并且使用的是签名URL,则需要保留给定文件的签名URL,并在后续页面加载中重新呈现完全相同的URL。

如果您尚未设置缓存控制标头,或者您希望它们根据发出请求的人进行更改,则可以在使用以下网址对您的网址进行签名之前对其进行设置:&response-cache-control=value&response-expires=value