Проблема с gzipping, синхронизацией AWS S3, cloudfront и my server


Чего я пытаюсь достичь, так это синхронизировать мои статические ресурсы CSS, JS, images, uploded images (около 1 миллиона) с 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 любой из этого контента, что приводит к огромному размеру страницы. Кроме того, заголовки expire также не отражаются в cloudfront. Если я включу $params['ContentEncoding'] = 'gzip'; Я получаю ERR_CONTENT_DECODING_FAILED. Я также внес изменения в настройки CloudFront, но ничего не работает. Кроме того, Пожалуйста, помогите мне с лучшими практиками для синхронизации S3, CloudFront и моего сервера.

Мой текущий фреймворк php-это YII2.

Пожалуйста, скажите мне, если требуется дополнительная информация, я внесу изменения.

Заранее благодарю.

1 2

1 ответ:

$params['ContentEncoding'] = 'gzip'; на самом деле не gzip ваш контент-он используется, чтобы указать, что вы уже gziped его самостоятельно, прежде чем загрузить его.

Если вы установили это, и вы не gzip содержимое, то ERR_CONTENT_DECODING_FAILED будет правильным.

Вы можете хранить содержимое в S3 несжатым и просто позволить CloudFront gzip его, если вы установите автоматически сжимать объекты в Yes в поведении кэша CloudFront.

После правильной настройки сделайте недействительность кэша CloudFront для *, затем протестируйте снова.

Также не устанавливайте Заголовок Expires. Ты почти наверняка этого не хочешь.

Просматривая заголовки из CloudFront, обратите внимание на Age. Именно так давно, в считанные секунды, CloudFront извлек объект из S3.