2.4.1.1.13. Серверное кеширование

Важные моменты:

  • При включении кеширования убедитесь, чтобы сайт отдавал заголовки запрета кеширования при работе с его админ-панелью, иначе такие страницы могут попадать в кеш и быть доступны неавторизованным пользователям.
  • При использовании сессий PHP автоматически добавляет в ответы заголовок Cache-Control и кеширование по умолчанию не работает. Для работы кеширования значение ограничителя кеша должно быть public (см. session_cache_limiter).

sequenceDiagram autonumber participant client as Клиент box Хостинг participant cache as Кеш participant site as Сайт end client->>cache: Запрос cache->>cache: Проверка кеша alt Кеш есть и не игнорируется cache->>client: Ответ из кеша else Кеша нет или он игнорируется cache->>site: Запрос end site->>site: Обрабртка запроса alt Без сохранения в кеше site->>client: Ответ else С сохранением в кеше site->>cache: Ответ cache->>cache: Кеширование ответа cache->>client: Ответ end

При использовании кеширования все ответы сервера сохраняются в кеше и при поступлении новых запросов вместо передачи их на обработку скриптам сайта возвращается уже готовый ответ из кеша. Использование кеширования помогает существенно снизить нагрузку на веб-сервер.

Страница не сохраняется в кеше:

  • Если запрос содержит:
    • Заголовок Cookie с ключом nocache с непустым значением и не равным 0.
    • GET-параметр nocache с непустым значением и не равным 0.
    • Заголовок Authorization с непустым значением и не равным 0.
  • Если ответ содержит:
    • Заголовок X-Accel-Expires со значением 0.
    • Заголовок Set-Cookie.
    • Заголовок Vary со специальным значением *.
    • Заголовок Cache-Control с любым из значений: max-age=0, private, no-store, no-cache.
  • Если в разделе «Настройки PHP» отключён параметр «output_buffering» (когда буферизация отключена, nginx не обрабатывает данные с веб-сервера и не может их кешировать).

Существующий кеш игнорируется, если запрос содержит такие же заголовки/параметры, при которых страница не сохраняется в кеше (см. выше). ⚠️ Кеш при этом не перезаписывается и не удаляется. Например, при запросе A страница была сохранена в кеше, затем поступил запрос B с условиями для игнорирования кеша — кеш был проигнорирован и страница была возвращена сайтом, если поступит запрос C без условий для игнорирования кеша — будет возвращён кеш, который был сгенерирован для запроса A.

С помощью заголовка ответа X-Cache-Status можно следить за использованием кеша:

  • Страница была возвращена сайтом:
    • MISS — страницы не было в кеше.
    • BYPASS — кеш был проигнорирован (см. выше).
    • EXPIRED — срок жизни кеша истёк.
  • Страница была возвращена из кеша:
    • STALE — срок жизни кеша истёк, но с сайта не удалось получить актуальную версию страницы.
    • REVALIDATED — срок жизни кеша истёк, но он был повторно проверен с помощью заголовка If-Modified-Since или If-None-Match.
    • UPDATING — срок жизни кеша истёк, но страница в процессе обновления с сайта.
    • HIT — страница была возвращена из кеша.

Когда кеш игнорируется и в ответе есть заголовок Cache-Control, к статусу может быть добавлено обозначение причины, по которой кеш был проигнорирован: /PRIVATE, /NO-CACHE, /NO-STORE, /MAX-AGE.

Серверное кеширование настраивается в разделе «Настройки сайта» на вкладке «Кеширование»:

  • Режимы:
    • «Отключено» — кеширование отключено.
    • «Включено» — кеширование с учётом GET-параметров (для запросов к одной и той же странице с разными GET-параметрами и без них из кеша будут возвращаться разные ответы).
    • «Игнорировать параметры запроса» — кеширование с игнорированием GET-параметров (для запросов к одной и той же странице с разными GET-параметрами или без них из кеша будет возвращаться одинаковый ответ).
  • «Срок жизни» — через сколько минут с момента последнего использования кеш будет удалён.
    • Подбирается индивидуально. Для сайтов с частыми обновлениями контента можно использовать небольшие значения, с редкими обновлениями — более высокие.

В разделе «Настройки сайта» на вкладке «Кеширование» нажмите «Очистить кеш».

Содержание

    (5)