Проблема с 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 ответ:
$params['ContentEncoding'] = 'gzip';
на самом деле не gzip ваш контент-он используется, чтобы указать, что вы уже gziped его самостоятельно, прежде чем загрузить его.Если вы установили это, и вы не gzip содержимое, то
ERR_CONTENT_DECODING_FAILED
будет правильным.Вы можете хранить содержимое в S3 несжатым и просто позволить CloudFront gzip его, если вы установите автоматически сжимать объекты в Yes в поведении кэша CloudFront.
После правильной настройки сделайте недействительность кэша CloudFront для
*
, затем протестируйте снова.Также не устанавливайте Заголовок
Expires
. Ты почти наверняка этого не хочешь.Просматривая заголовки из CloudFront, обратите внимание на
Age
. Именно так давно, в считанные секунды, CloudFront извлек объект из S3.