Как я могу снизить стоимость передачи данных? Amazon S3 → Cloudflare → Посетитель

Недавно я начал использовать Amazon S3 для обслуживания изображений для моих посетителей, так как это уменьшит нагрузку на сервер. Теперь есть новая проблема: сегодня я заглянул в свои счета AWS. Я заметил, что у меня есть огромный счет, ожидающий меня - в течение 20 дней было всего 4TB AWS Data Transfer.

Очевидно, это связано с тем, что большое количество исходящего трафика Amazon S3 (до Cloudflare, который затем служит для посетителей). Теперь я должен уменьшить количество запрошенных файлов, установив заголовок Cache (так как 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 году)

EDIT: Я наткнулся на это: Amazon S3 не кэширует изображения, но, к сожалению, это решение не работает для меня.

EDIT 2: Оказывается, это не сработало, потому что я использовал старую версию класса Amazon S3. Я обновился, и код работает сейчас.

Спасибо за ваше время.

Ответ 1

Если вы получаете "x-amz-meta-cachecontrol", вероятно, вы неправильно настраиваете заголовки. Это может быть именно то, как вы это делаете в своем коде. Это должно работать. Я выводя это php, используя класс Amazon S3 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()])

Вам нужно установить кеш-контроль как заголовок запрос, но, похоже, нет возможности устанавливать заголовки запросов с putObjectFile, только мета-заголовками. Вы должны использовать putObject и дать ему пустой массив для заголовков метаданных, а затем еще один массив с заголовками запросов (включая управление кешем).

Вы также можете попробовать некоторые из других рабочих примеров, которые я привел ниже.

См. также:

Как установить заголовки Expires и Cache-Control для всех объектов в ведро AWS S3 с PHP script (php)

Обновление заголовков кеширования для Amazon S3 и CloudFront (python)

Автоматически установить кеш-контроль для всего ведра S3 (используя политики ведра?)

http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225

Ответ 2

Теперь вы можете. Перейдите в ведро s3. Откройте файл и установите свойство

Aws console