Amazon S3: кеширование страниц веб-сайта

01 June 2015 #amazon#tips

Во время публикации сайта с использованием s3_website есть возможность управлять кешированием для файлов определенных типов. Для этого в конфигурации есть отдельный раздел:

max_age:
  "assets/*": 6000
  "*": 300

В приведенном примере для файлов из директории assets задается время жизни в 6000 секунд, а для всех остальных 300 секунд. Вроде все просто и замечательно. Но, как оказалось, амазон использует свои собственные параметры, задаваемые при создании нового bucket для веб-сайта. И эти настройки являются более приоритетными, чем те, что задаются отдельно для каждого файла.

Для того, чтобы поправить эти настройки достаточно зайти на веб-страницу со списком всех bucket и в разделе Permissions выбрать кнопку “Edit CORS Configuration”:

Settings

CORS

По умолчанию будет примерно следующая конфигурация:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>Authorization</AllowedHeader>
  </CORSRule>
</CORSConfiguration>

Для того, чтобы параметры кеширования брались только из параметров файлов, достаточно изменить параметр MaxAgeSeconds в 0:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <MaxAgeSeconds>0</MaxAgeSeconds>
    <AllowedHeader>Authorization</AllowedHeader>
  </CORSRule>
</CORSConfiguration>

И теперь можно для html-файлов задавать время жизни в 0 секунд. Что позволит показывать пользователям всегда актуальную версию страницы. И при этом иметь возможность сохранять стили и скрипты на продолжительное время.

Update (Jun 07 2015)

CORS расшифровывается как Cross-Origin Resource Sharing, и данная технология используется для шаринга ресурсов приложения между различными доменами. Эксперимент с использованием CORS проведен некорректно.

Как выяснилось позже, моя ошибка заключалась в том, что я задавал параметры кеширования через max_age и в итоге получал следующий ответ от сервера:

Cache-Control: no-cache; max-age=0

В то время как требовалось получать ответ:

Cache-Control: no-cache, no-store

Более подробный ответ на вопрос почему, можно найти на странице developers.google.com. Как оказалось, самый важный здесь именно параметр no-store.

Для этого в s3_website используется параметр cache_control:

cache_control: public, no-transform, max-age=1200, s-maxage=1200

или различные правила, для различных ресурсов:

cache_control:
  "assets/*": public, max-age=3600
  "*": no-cache, no-store

Только после внесения изменения в конфигурацию s3_website и повторной публикаций с принудительным обновлением ресурсов, получил требуемый результат: веб-страницы загружаются заново при каждом запросе, а все ресурсы из директории assets хранятся в кеше месяц.

Результаты: прежняя конфигурация и новая конфигурация. Обратите особое внимание на количество запросов при повторном обращении к серверу.