2013-12-23 76 views
5

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

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

“it”从S3下载文件...什么是“它?”浏览器?或者服务器?你是否试图使用S3作为文件系统? –

+0

“it”=“浏览器”。 – pramodtech

+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头摆弄永远不会让你的缓存行为,你正在寻求。

+0

如果你能帮助我理解签名的url与未签名的url,那么我可能会决定是否可以使用未签名的url,因为你应该解决我的问题。 – pramodtech

+0

AWS签名的URL看起来像'/song1.mp3?Expires = 123&Signature = abc',并按需生成。如果您为每个请求创建签名的URL,那么任何人都不会缓存这些URL。您有两种方法来缓存对象:1)使对象的读取策略为public,这样每个人都可以通过'/ song1.mp3'访问它,而不需要查询字符串,2)创建一个系统来存储和管理签名的URL,同一个用户看到相同的确切签名URL'/song1.mp3?Expires = 123&Signature = abc'多次(一个更大的工作)。 –

2

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

设置的Cache-Control使用更新元数据的S3已经上传的文件:

1)运行斗Explorer和使用您的凭据登录。

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

3)它会列出所选S3桶的所有对象。

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

5)在元数据属性中添加密钥和值。输入密钥:“缓存控制”,值为“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文件,设置键:“缓存控制”和值:最大年龄=(时间,而您希望从高速缓存在几秒钟内访问你的对象),必须 - 重新验证“即键:“缓存控制”值:max-age =“2592000,必须重新验证”30天。 “必须重新验证”字符串必须在第二秒后添加为值。

1

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

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