Кэширование Drupal 7 может быть реализовано с помощью Varnish или любого другого кэширующего reverse proxy сервера, главное правильно настроить.
Этот пост является переводом отличной статьи с dev.nodeone.se, в которой описано как можно контролировать актуальность кэша Varnish на Drupal сайте, используя модули Varnish, Expire, Cache Actions.
Использование Varnish позволяет существенно ускорить сайт на Drupal. Drupal 7 позволяет работать с кэширующими reverse proxy серверами из коробки и интеграцию Varnish и Drupal 7 можно сделать с помощью модуля Varnish.
Настройка Drupal для работы с Varnish
У нас есть новая установка Drupal 7 и настроенный Varnish перед ним. Необходимо в Drupal сделать некоторые настройки для работы с Varnish:
- Переходим на страницу "Администрирование"=>"Конфигурация"=>"Разработка"=>"Производительность".
- Устанавливаем флаг "Кэшировать страницы для анонимных пользователей".
- Выбираем время жизни кэша "Максимальное время" отличным от "<нет>".
Теперь можно посмотреть заголовки ответа при открытии страниц нашего сайта. Сделать это можно используя firebug в браузере Firefox или "Средства для разработки" в Chrome/Chromium (Ctrl+Shift+J). Если все правильно настроено, то заголовки должны выглядеть примерно следующим образом:
Age:4152 Cache-Control:public, max-age=86400 Connection:keep-alive Content-Encoding:gzip Content-Language:ru Content-Length:8183 Content-Type:text/html; charset=utf-8 Date:Sun, 25 Mar 2012 09:31:11 GMT ETag:"1332663716-1" Expires:Sun, 19 Nov 1978 05:00:00 GMT Last-Modified:Sun, 25 Mar 2012 08:21:56 +0000 Server:Apache/2.2.16 (Debian) Vary:Cookie,Accept-Encoding Via:1.1 varnish X-Drupal-Cache:MISS X-Generator:Drupal 7 (http://drupal.org) X-Powered-By:PHP/5.3.3-7+squeeze3 X-Varnish:1419994919 1419994592
Обратите внимание на заголовок Cache-Control. Этим заголовоком Drupal информирует, что страница закэширована на 86400 секунд (на 1 день). Если у вас не установлен этот заголовок (возможно с каким-то другим значением) значит где-то ошиблись с настройкой кэширования.
Также обратите внимание на заголовок X-Varnish. Если в него записаны 2 значения, значит страница выдана из кэша Varnish.
Не беспокойтесь, что заголовоко X-Drupal-Cache имеет значение MISS. Это значение будет всегда, когда страницы будут выдаваться из кэша Varnish.
Обновление кэша
Мы настроили Varnish и Drupal. Кэш будет автоматически обновляться по истечении установленного в настройках Drupal времени. Но этого недостаточно, если вы хотите, чтобы пользователи получали новый контент сразу, как только вы его добавили, обновили или удалили.
Встроенное в Drupal кэширование работает следующим образом:
- Все страницы сохраняются в кэше Drupal (таблица cache_page) после первого посещения.
- Если не установлен параметр "Минимальное время жизни кэша", то весь кэш сбрасывается, как только происходит добавление/обновление/удаление материала. Этот параметр позволяет хранить кэш заданное количество минут.
Но встроенное кэширование не работает с Varnish, потому что в Drupal нет встроенной возможности сообщить Varnish об изменении контента. Модуль Varnish позволяет нам решить эту проблему. Этот модуль позволяет Drupal взаимодействовать с Varnish через порт для администрирования, по умолчанию 6082.
Для установки модуля Varnish необходимо:
- Установите модуль varnish.
- Перейдите на страницу настройки модуля Varnish (admin/config/development/varnish) и установите следующие параметры:
Varnish version — используемая версию Varnish. Varnish Control Terminal — IP адрес и порт сервера Varnish. Varnish Control Key — Ключ для подключения к Varnish. Посмотреть его можно в файле: /etc/varnish/secret Varnish Cache Clearing — должно быть установлено в Drupal Default.
Модуль Varnish использует возможность Drupal называемую "Cache backend", которая позволяет заменить встроенный функционал кэширования на другую реализацию. Для того, чтобы модуль начал работать необходимо добавить в файл settings.php следующие строки:
$conf['cache_backends'] = array('sites/all/modules/varnish/varnish.cache.inc'); $conf['cache_class_cache_page'] = 'VarnishCache';
Теперь модуль Varnish работает и для проверки можно сделать следующее:
- Открыть страницу под анонимным пользователем, и, посмотрел на заголовки, убедиться, что страница загружена из кэша Varnish.
- Изменить эту страницу.
- Обновить открытую в браузере страницу под анонимным пользователем. Эта страница должна обновиться и она будет закэширована после первого просмотра.
В результате мы получили функционал встроенного в Drupal кэширования, используя Varnish.
Расширенное использование
Встроенный в Drupal функционал кэширования работает отлично для небольших Drupal сайтов с небольшим количеством посетителей, но если на вашем сайте большое количество посетителей, то скорее всего вы захотите изменить этот функционал. Сброс кэша для всего сайта может быть критичным для больших сайтов. Простейший способ выхода из этой ситуации — установить параметр "Минимальное время жизни кэша", это позволит не слишком часто сбрасывать весь кэш, но тем не менее кэш будет сбрасываться полностью.
Выходом из этой ситуации является:
- Использование модуля Cache Expiration. Этот модуль интегрирован с модулем Varnish и удаляет из кэша страницы, на которых присутствует измененный контент. В этом модуле реализована логика работы модуля Boost по удалению кэша. Модуль Expire находится в стадии активной разработки, поэтому есть вероятность столкнуться с проблемами и придется обращаться за помощью на форум к разработчикам.
- Использование модуля "Cache actions", который позволяет удалить кэш страницы конкретного нода, после его изменения. Этот модуль позволяет создавать правила удаления кэша с использованием модуля Rules.
Для настройки Cache actions для удаления кэша страницы нода, после изменения нода необходимо:
- На странице настройки Varnish (admin/config/development/varnish) выбрать "none" для параметра "Varnish Cache Clearing". Это позволит не сбрасывать весь кэш, при изменении материалов на сайте.
- Установить и включить модули "Cache Actions" и "Rules UI".
- На странице admin/config/workflow/rules создать новое правило.
- В поле "Реакция на событие" выбрать "После сохранения нового документа".
- Добавьте действие (action) "Clear a specific cache cid".
- В параметре "CACHE BIN" укажите "cache_page".
- В поле "CACHE KEY" впишите node/[node:nid].
Попробуйте отредактировать какой-нибудь нод, все должно работать. Сейчас разница в том, что из кэша удалена не вся страница, а только запись конкретного измененного нода. Вы можете попробовать открыть другую страницу и убедиться, что она все еще кэширована, посмотрев заголовки.
Другие решения
Есть еще модуль Purge, который делает все тоже самое, что и Varnish, только для удаления кэша из Varnish использует HTTP запрос вместо подключения к порту администрирования, как делает Varnish.