我想要实现的是同步我的静态资源 CSS, JS, images, uploded images
(约100万)至S3 bucket
并使用 cloudfront
交付它们。为了同步,我使用 AWS PHP SDK v2.8x。以下是我的代码:
$folder = $_GET['folder'];
$concurrency = $_GET['concurrency'];
$force = $_GET['force'];
$rootPath = Yii::$app->params['root_path'];
$bucket = 'my-bucket';
$client = S3Client::factory(array(
'key' => "my-key",
'secret' => "my-secret",
'stats' => true
));
$params = array();
$metadata = array();
$options = array();
$params['ACL'] = 'public-read';
//$params['ContentEncoding'] = 'gzip';
$params['Expires'] = 'Wed, 20 Jun 2018 07:48:05 GMT';
$params['CacheControl'] = 'max-age=31536000';
$options['params'] = $params;
$options['concurrency'] = $concurrency;
//$options['debug'] = true;
$options['force'] = $force;
$client->uploadDirectory($rootPath.'/'.$folder, $bucket, $folder, $options);
我已成功将所有内容上传到 S3 存储桶,并且与 cloudfront 同步也成功。但问题是我无法对这些内容进行 gzip 压缩,从而导致页面大小巨大。此外,过期 header 也不会反射(reflect)在云端。如果我启用 $params['ContentEncoding'] = 'gzip';
我得到ERR_CONTENT_DECODING_FAILED
。我也对 CloudFront 设置进行了更改,但似乎没有任何效果。
另外,请帮助我了解同步 S3、CloudFront 和我的服务器的最佳实践。
我当前的php框架是YII2。
如果需要补充信息,请告诉我,我会进行编辑。
提前致谢。
最佳答案
$params['ContentEncoding'] = 'gzip';
实际上并不对您的内容进行 gzip 压缩 - 它用于指示您在上传之前已经自己对其进行了 gzip 压缩。
如果您设置了该值,并且没有对内容进行 gzip 压缩,则 ERR_CONTENT_DECODING_FAILED
是正确的。
如果您在 CloudFront 缓存行为中将“自动压缩对象”设置为"is",则可以将未压缩的内容存储在 S3 中,并让 CloudFront 对它进行 gzip。
正确设置后,对 *
进行 CloudFront 缓存失效,然后再次测试。
此外,请勿设置 Expires
header 。您几乎肯定不希望这样。
检查 CloudFront 中的 header 时,请注意 Age
。这是多久之前(以秒为单位)CloudFront 从 S3 获取对象的时间。
关于amazon-web-services - gzipping、AWS S3、cloudfront 和我的服务器同步的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44674892/