Cacheability

Некоторые мысли о концепции кэширования в системе ZSite

Есть несколько уровней кэширования между субъектами системы (браузер, возможные прокси, наш фронтенд, бэкенд):

  • Кэш браузера
  • Кэш промежуточных прокси
  • Кэш фронтенда
  • Кэш бэкенда, который формируется следующим образом
    • Кэш страницы как целое (cache_self)
    • Кэш подкомпонентов страницы (cache)
                                                     dynamic storage
          p r o x i e s               |              -------------
Browser <--> |||| <--->Frontend <---> | <..........> Backend
                                      |              /  \
                                      |             /    dynamic
                                      | Mason Cache
                                      |    document (cache_self)
                                      |    | | | |
                                      |   component cache
                                      +----------------------------
                                       virtual quasi-static storage

Практика показывает, что mod_accel выдает все хорошо наружу, поэтому нам нужно заботиться только о том, чтобы бэкенд правильно сформировал заголовки, на основе которых, фронтенд смог бы определить что делать с ответом - просто отдать клиенту, или еще положить в свой кэш на некоторый период времени. Тем более, что возможные промежуточные прокси могут делать совершенно немыслимые вещи и нет смысла заботиться о тонкой настройке заголовков ответа :)

Со стороны бэкенда нам имеет смысл заботиться в основном о кэшировании страницы целиком, так как именно этот кэш может служить для фронтенда как-бы хранилищем (виртуальным) документов. Страница может находиться в этом кэше во многих экземплярах в зависимости от аргументов (параметров). Конечно, не все параметры влияют на содержание страницы, поэтому их правильный выбор весьма важен. Кэш подкомонентов не так интересен, можно просто выбрать некоторое разумное время, скажем час. Это кэш используется только когда истечет время кэша всего документа, что должно быть не очень часто.

Конечно, есть запросы, которые должны обрабатываться динамически, например, авторизационные.

Основные загловки, о которых надо заботиться:

  • Expires
    • Для динамических страниц по-умолчанию - 1 час (может быть изменено для каждой конкретной страницы)
    • Для статических страниц - среднее время между выкатками (зависит от конкретного проекта и должно регулироваться внутри VirtualHost)
  • Cache-Control - ?
  • Last-Modified - для статических страниц - это время последней выкатки
  • Pragma: no-cache - для стадий, отличных от production, и для алиасов /au

Картинки у нас обслуживаются отдельным сервером, который надо настроить для выдачи реальной даты Last-Modified и Expires (что-нибудь около месяца). thttpd это может делать.

Ссылки (проверить):

  • Cacheability [1]
  • Проверить cacheability [2]