如何降低数据传输成本? Amazon S3 --> Cloudflare --> 访客
Posted
技术标签:
【中文标题】如何降低数据传输成本? Amazon S3 --> Cloudflare --> 访客【英文标题】:How can I reduce my data transfer cost? Amazon S3 --> Cloudflare --> Visitor 【发布时间】:2012-12-02 15:10:37 【问题描述】:我最近开始使用 Amazon S3 向我的访问者提供图像,因为这将减少服务器负载。现在,有一个新问题:今天我查看了我的 AWS 账单。我注意到我有一笔巨额账单在等着我 - 20 天内总共有 4TB 的 AWS 数据传输。
显然,这是因为大量的传出 Amazon S3 流量(到 Cloudflare,然后将其提供给访问者)。现在我应该通过设置缓存标头来减少请求文件的数量(因为 Cloudflare 的 Crawler 会尊重这一点)。我已经像这样修改了我的代码:
$s3->putObjectFile($path, $bucket , 'images/'.$id.'.jpg', S3::ACL_PUBLIC_READ);
到
$s3->putObjectFile($path, $bucket , 'images/'.$id.'.jpg', S3::ACL_PUBLIC_READ, array('Cache-Control' => 'public,max-age=31536000'));
但还是不行。 Cloudflare 不尊重缓存,因为 Cache-Control 不会在标头中显示为“Cache-Control”,而是显示为“x-amz-meta-cachecontrol”。 Cloudflare 忽略了这一点。
有人对此有简单的解决方案吗?
TL;DR:我和这个人有或多或少相同的问题:http://support.bucketexplorer.com/topic734.html(那是在 2008 年)
编辑:我偶然发现了这个:Amazon S3 not caching images 但不幸的是,该解决方案对我不起作用。
编辑 2: 原来它不起作用,因为我使用的是旧版本的“Amazon S3 类”。我更新了,代码现在可以工作了。
感谢您的宝贵时间。
【问题讨论】:
【参考方案1】:如果您收到“x-amz-meta-cachecontrol”,可能是您没有正确设置标头。这可能只是您在代码中执行此操作的确切方式。这 是 应该工作。我推断这是使用 Amazon S3 php 类的 php?
试试这个:
$s3->putObject(file_get_contents($path), $bucket, $url, S3::ACL_PUBLIC_READ, array(), array('Cache-Control' => 'max-age=31536000, public'));
在S3 PHP docs putObjectFile
列在 Legacy Methods 下:
putObjectFile (string $file,
string $bucket,
string $uri,
[constant $acl = S3::ACL_PRIVATE],
[array $metaHeaders = array()],
[string $contentType = null])
比较一下:
putObject (mixed $input,
string $bucket,
string $uri,
[constant $acl = S3::ACL_PRIVATE],
[array $metaHeaders = array()],
[array $requestHeaders = array()])
您需要将缓存控制设置为 request 标头,但似乎无法使用putObjectFile
设置请求标头,只能设置元标头。您必须使用 putObject
并为元标头提供一个空数组,然后为它提供另一个包含请求标头(包括缓存控制)的数组。
您还可以尝试我在下面列出的其他一些工作示例。
另见:
How to set the Expires and Cache-Control headers for all objects in an AWS S3 bucket with a PHP script (php)
Updating caching headers for Amazon S3 and CloudFront(蟒蛇)
Set cache-control for entire S3 bucket automatically (using bucket policies?)
http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225
【讨论】:
我明白了为什么它不起作用。原来我使用的是旧版本的“Amazon S3 PHP 类”。我更新并使用了您建议的代码,现在新文件有一个 Cache-Control 集。伟大的!我还将查看您的第二个链接,以为存储桶中已经存在的文件设置所有 Cache-Control 标头。这应该可以解决我所有的问题。谢谢你的一切! @Jonas:您是否能够通过这种方法减少数据传输?...我知道它很长..但我现在在您的船上。【参考方案2】:现在可以了。转到 s3 存储桶。打开文件并设置属性
【讨论】:
以上是关于如何降低数据传输成本? Amazon S3 --> Cloudflare --> 访客的主要内容,如果未能解决你的问题,请参考以下文章
HIVE 或 PIG 作为 Amazon Redshift 的替代品?
使用Amazon EMR和Apache Hudi在S3上插入,更新,删除数据