我在Amazon EC2上运行了RESTful Web服务。由于我的应用程序需要处理大量照片,我计划将它们放在Amazon S3上。因此,从S3检索照片的URL可能如下所示:
http://johnsmith.s3.amazonaws.com/photos/puppy.jpg
有没有办法或必要在EC2上缓存图像?我能想到的优点和缺点是: 1)通过改善图像获取性能降低了S3的使用和成本。然而另一方面,EC2成本可能上升,加上EC2可能由于带宽限制而无法处理图像缓存。 2)增加开发复杂性,因为您需要首先检查缓存并要求S3将图像传输到EC2,然后传输到客户端。
我正在使用EC2微型实例,并且觉得最好不要在EC2上进行图像缓存。但是规模可能会快速增长并最终需要图像缓存。(我是对的吗?)如果需要缓存,在EC2或S3上进行缓存是否更好? (有没有办法为S3缓存?)
顺便说一下,当客户端上传图片时,是否应该直接上传到EC2或S3?
答案 0 :(得分:1)
EC2缓存实例的几个场景:
您的上传/下载比率远远低于50/50
你达到S3限制100req / sec
您需要网址屏蔽
您希望优化内核,TCP / IP设置,缓存客户端的SSL会话
您希望所有地理位置都有适当的缓存无效机制
您需要100%控制存储数据的位置
您需要计算请求数量
您有自定义身份验证机制
出于多种原因,我建议您查看Nginx S3 proxy。
答案 1 :(得分:0)
一般来说,这里是层级:
best CDN (cloudfront)
good static hosting (S3)
okay dynamic (EC2)
为什么呢?有几个原因。
无论您在何处提供静态内容,正确使用Cache-Control
标题都会让生活更美好。使用该标题,您可以告诉浏览器内容有多长。如果它永远不会改变,您可以指示浏览器将其保留一年。如果频繁更改,您可以指示浏览器将其保留一小时或一分钟,或每次重新验证 。您可以向CDN提供类似的说明。
Here's a good guide,以下是一些例子:
# keep for one year
Cache-Control: max-age=2592000
# keep for a day on a CDN, but a minute on client browsers
Cache-Control: s-maxage=86400, maxage=60
您可以将此添加到从EC2实例提供的页面(无论是nginx,Tornado,Tomcat,IIS),您可以将其添加到S3文件的标题中,CloudFront将使用这些值。
我会不将图像从S3拉到EC2然后再提供它们。这是浪费精力。只有少数用例才有意义。
答案 2 :(得分:0)
为什么要将EC2纳入等式?我强烈建议在场景中使用CloudFront。
将CloudFront与S3结合使用时作为原点;内容分发到全球49个不同的位置(截至目前全球边缘位置数),直接在全球范围内作为缓存,并根据最终用户的延迟从最近的位置获取内容。
您不必担心Cache和EC2的规模和性能,可以直接将其卸载到CloudFront和S3。