amazon-web-services - gzipping、AWS S3、cloudfront 和我的服务器同步的问题

标签 amazon-web-services amazon-s3 yii2 aws-sdk amazon-cloudfront

我想要实现的是同步我的静态资源 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/

相关文章:

ruby-on-rails - 如何在 Rails 中从 Amazon s3 读取手动上传的文件(图像/文本)?

css - rails : Referring to image in CSS

css - 使用 amazon s3 托管静态图像并从 css 引用

yii2 - 制作 Yii2 扩展时的最佳实践

mysql - 如何在 Yii/Yii2 的同一个项目(应用程序)中连接 MongoDB 和 MySQL?

amazon-web-services - Tensorboard 的 SageMaker 网址是什么?

python - Boto - 将文件上传到 Amazon S3 上的特定位置

java - SQSListener 与 ThreadpoolExecutor

amazon-web-services - 更新 S3 存储桶而不删除它

yii2 - 如何将参数传递给 mainLayoutAsset.php 文件?