Решил написать обзорный пост о методах кэширования Drupal сайтов и нашел на просторах Интернета статью от технического консультанта Acquia, как раз затрагивающая эту тему. Поэтому сегодня будет перевод этой статьи.
Это первый пост в блоге из серии о стратегиях кэширования в Drupal. В этом посте мы попытаемся понять какие возможности в плане кэширования есть в Drupal "из коробки", и какие возможности расширения для работы сайтов под высокими нагрузками.
В отличие от статических HTML сайтов страницы Drupal сайта состоят из блоков, которые формируются независимо друг от друга, перед тем как будут объединены и отправлены в браузер как единое целое. Drupal это динамическая платформа, генерирующая контент, поэтому для генерации страницы, которая будет отправлена в браузер, на веб-сервере выполняется последовательность действий, таких как: соединение с базой данных, загрузка параметров и модулей, инициализация пользовательской сессии, преобразования URL в вызов PHP для запуска логики приложения, и сбор воедино всех элементов вокруг основного содержимого страницы.
Большинство из этих шагов повторяется каждый раз, во время генерации страницы, но с помощью эффективной стратегии кэширования можно минимизировать использование ресурсов, во время выполнения этих шагов, путем сохранения результата повторяющихся вычислений. Это становится сложнее с трафиком от зарегистрированных пользователей, так как для них используются персонализированные страницы, что исключает возможность кэширования страницы целиком. В этих более сложных случаях используется кэш более низкого уровня для хранения отдельных блоков страницы.
Чем больше элементов кэшируется, тем внимательнее нужно относится к бэкенду, который хранит информацию.
По умолчанию Drupal кэширует информацию прямо в базу данных. Это видно по многим таблицам в базе Drupal имена которых начинаются на "cache_".
В Drupal есть возможность кэшировать страницы целиком или их части и использовать эту информацию снова для генерации новых страниц.
Кэширование страниц
Если страницы выглядят одинаково во всех ситуация и пользовательский контекст не имеет значения, то такие страницы могут быть закэшированы и выдаваться пользователям напряму их кэша. Есть несколько вариантов кэширования таких страниц:
- Обратный прокси (внешее кэширование): Обратный прокси (reverse proxy) — это тип прокси сервера, который от имени клиента запрашивает информацию от одного или нескольких серверов. Использование обратного прокси сервера Varnish пользуется популярностью в архитектуре (ИТ инфраструктуре) высоконагруженных Drupal проектов. Varnish находится перед веб-сервером и кэширует запросы, у которых нет cookies. Varnish может быть использован для кэширования анонимных запросов, так как он невероятно быстр за счет хранения всего кэша в памяти и, при необходимости, на жестком диске. Drupal 7 имеет встроенную поддержку Varnish, в то время как для интеграции с Drupal 6 необходимо использовать Pressflow, чтобы в анонимных запросах не было cookies. По умолчанию модуль Drupal Varnish будет использовать параметр "Максимальное время жизни кэша" для определения Expiration date, но, например, модуль Expire может быть использован для очистки кэша Varnish при изменении контента, гарантируя пользователям самую свежую информацию. Страницы, передаваемые напрямую из кэша Varnish, содержат дополнительную информацию, помогающую определить корректно ли работает кэширование. В Acquia мы фанаты varnish, любая страница переданная из облака acquia содержит эту информацию, например, acquia.com:
Via 1.1 varnish X-Cache HIT X-Cache-Hits 9970 X-Varnish 816323757 811625039
- Boost: Boost — это модуль, использующий модифицированный файл .htaccess для загрузки страниц с диска вместо запуска PHP для динамической генерации страницы. Этот модуль генерирует HTML страницы каждый раз, когда к странице осуществляется доступ и сохраняет эту страницу в HTML файл на диск. При следующем запросе Apache перед запросом к Drupal проверит наличие на диске HTML файла и попытается выдать этот файл. В модуль Boost включен краулер, который запускается по крону и заново генерирует устаревший контент, для более быстрой загрузки страниц. Страницы выданные напрямую из кэша Boost содержат в коротку метку в конце HTML кода, например:
<!-- Page cached by Boost @ 2012-03-05 10:55:30, expires @ 2012-03-05 16:55:30 -->
- Встроенное кэширование: В Drupal есть возможно сохранять страницы напрямую в кэширующий бэкенд. Если кэширование включено, то Drupal будет кэшировать страницы для анонимных пользователей каждый раз, когда страница будет сгенерирована. Следующий анонимный запрос получит кэшированную версию страницы вместо генерации страницы заново.
По умолчанию эта стратегия работает только с анонимными запросами, потому что зачастую для зарегистрированных пользователей страницы выглядят по-разному для разных пользователей. Страницы могут отличаться как небольшим сообщением "Добро пожаловать, Джо" в верху страницы, так и блоком, который показывает избранные ссылки или материал, который пользователь комментировал. Такие страницы нельзя кэшировать, так как в большинстве своем они разные для каждого пользователя, поэтому по умолчанию в Drupal невозможно кэшировать страницы для зарегистрированных пользователей.
При загрузке страницы из кэша не будут вызываться Drupal хуки (вызываются только hook_boot и hook_exit), поэтому перед включением кэширования важно убедиться, что хуки не должны вызываться на каждом запросе страницы.
Однако есть стратегии для выхода из этой ситуации. В следующий раз мы рассмотрим стратегии, которые позволят нам добиться частичного кэширования и значительно ускорить Drupal даже для запросов авторизованных пользователей.
Читайте продолжение про кэширование для зарегистрированных пользователей.