Кэширование анонимных запросов в Drupal 7. Установка и настройка Varnish.

Опубликовано admin - пн, 05/14/2012 - 19:11

В статье, посвященной кэшированию в Drupal, мы рассмотрели эффективность использования Varnish для кэширования анонимных запросов для Drupal 7. Сегодня будет инструкция по установке и настройке Varnish для Drupal 7 в Debian Stretch, как фронтенд к Apache, то есть Varnish будет кэшировать все запросы анонимных пользователей к Apache. Предположим, что у нас уже есть веб-сервер Apache + PHP + Mysql, настроенный по этой инструкции.

Установка и настройка Varnish

Первым шагом скачиваем GPG ключ и добавляем его:

curl -L https://packagecloud.io/varnishcache/varnish5/gpgkey | sudo apt-key add -

Далее необходимо установить зависимости для использования https-репозиториев:

apt-get install apt-transport-https debian-archive-keyring -y

Добавляем репозиторий Varnish 5 в список источником и обновляем список пакетов из репозиториев:

echo "deb https://packagecloud.io/varnishcache/varnish5/debian/ stretch main" | sudo tee -a /etc/apt/sources.list.d/varnishcache_varnish5.list
echo "deb-src https://packagecloud.io/varnishcache/varnish5/debian/ stretch main" | sudo tee -a /etc/apt/sources.list.d/varnishcache_varnish5.list
apt-get update

Устанавливаем пакет varnish в Debian:

apt-get install varnish

Для изменения основных параметров запуска Varnish необходимо создать drop-in snippets для файла юнита /lib/systemd/system/varnish.service. Для этого создадим файл /etc/systemd/system/varnish.service.d/local.conf, в которым выполним переопределение строки ExecStart. Это гарантирует, что изменения, внесенные непосредственно в службу systemd, не будут перезаписаны при обновлении:

mkdir -p /etc/systemd/system/varnish.service.d
nano /etc/systemd/system/varnish.service.d/local.conf

Запишем в файл следующие строки, запускающие службу varnish на 80 порту:

[Service]
ExecStart=
ExecStart=/usr/sbin/varnishd -a :80 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256

После того как файл был создан, нам необходимо перезагрузить системный демон для обновления файла:

systemctl daemon-reload

Основная конфигурация varnish написана на языке vcl и располагается в файле /etc/varnish/default.vcl, который может быть например таким:

vcl 5.0;

# Устанавливаем конфигурацию бэкенда Apache. 
backend default { 
     .host = "127.0.0.1"; 
     .port = "8080"; 
}

sub vcl_recv {

# Не кэшируем эти пути.
if (req.url ~ "^/status\.php$" ||
    req.url ~ "^/update\.php" ||
    req.url ~ "^/install\.php" ||
    req.url ~ "^/apc\.php$" ||
    req.url ~ "^/admin" ||
    req.url ~ "^/admin/.*$" ||
    req.url ~ "^/user" ||
    req.url ~ "^/user/.*$" ||
    req.url ~ "^/users/.*$" ||
    req.url ~ "^/info/.*$" ||
    req.url ~ "^/flag/.*$" ||
    req.url ~ "^.*/ajax/.*$" ||
    req.url ~ "^.*/ahah/.*$" ||
    req.url ~ "^/system/files/.*$") {

  return (pass);
}

# Всегда кэшируем следующие типы файлов для всех пользователей.
if (req.url ~ "(?i)\.(pdf|asc|dat|txt|doc|xls|ppt|tgz|csv|png|gif|jpeg|jpg|ico|swf|css|js)(\?.*)?$") {
  unset req.http.Cookie;
}

# Удалить все cookie, о которых Drupal-у не нужно знать. Мы явно 
# указыввем те, которые нужны Drupal, SESS и NO_CACHE. Если после 
# выполнения этого кода, мы обнаруживаем, что любой из этих двух видов cookie 
# остается, мы будет пропускать, поскольку страница не должна быть кэширована.

if (req.http.Cookie) {
  set req.http.Cookie = ";" + req.http.Cookie;
  set req.http.Cookie = regsuball(req.http.Cookie, "; +", ";");
  set req.http.Cookie = regsuball(req.http.Cookie, ";(SESS[a-z0-9]+|SSESS[a-z0-9]+|NO_CACHE)=", "; \1=");
  set req.http.Cookie = regsuball(req.http.Cookie, ";[^ ][^;]*", "");
  set req.http.Cookie = regsuball(req.http.Cookie, "^[; ]+|[; ]+$", "");

  if (req.http.Cookie == "") {
    unset req.http.Cookie;
  }
  else {
    return (pass);
  }
}
}

# Установите заголовок для отслеживания HIT или MISS кеша
sub vcl_deliver {
    unset resp.http.X-Url;
    unset resp.http.X-Host;
    unset resp.http.Purge-Cache-Tags;
    if (obj.hits > 0) {
        set resp.http.X-Varnish-Cache = "HIT";
    }
    else {
        set resp.http.X-Varnish-Cache = "MISS";
    }
}

Переносим Apache на порт 8080, так как на 80 порту у нас будет Varnish. Для этого вносим изменения в файл /etc/apache2/ports.conf: Необходимо изменить строки

NameVirtualHost *:80
Listen 80

на

NameVirtualHost *:8080
Listen 8080

Для вступления изменений в силу перезагружаем Apache

/etc/init.d/apache2 reload

Запускаем Varnish командой

/etc/init.d/varnish restart

Настройка Drupal 7 для работы с Varnish

Сейчас у нас уже готов настроенный к работе Varnish, но нет инструментов обновления кэша из Drupal. Для настройки обновления кэша необходимо посмотреть статью Кэширование в Drupal 7. Модули Varnish, expire, cache actions и выбрать каким образом Вы будете обновлять кэш Varnish для своего сайта. Простейшим вариантом, но не самым оптимальным, является использование модуля Varnish и встроенного в Drupal механизма кэширования. Почитать про настройку этого варианта можно также в этой же статье. Важным нюансом использования обратного прокси сервера перед Drupal является то, что Drupal будет "думать", что все посещения происходят с IP адреса прокси сервера, то есть во всех отчетах в качестве хоста будет указан IP адрес обратного прокси сервера. Для устранения этого недостатка необходимо в файл settings.php прописать следующие настройки:

$conf['reverse_proxy'] = TRUE;
$conf['reverse_proxy_addresses'] = array('127.0.0.1','реальный ip адрес сервера');

После внесения этих изменений в качестве IP адреса клиента Drupal будет брать адрес из поля HTTP заголовка 'HTTP_X_FORWARDED_FOR', которое Varnish указывает при пересылке запросов. Вот мы и настроили веб-сервер для кэширования анонимных запросов к сайту на Drupal 7, с помощью Varnish. Если есть предложения по оптимизации этого решения, то давайте обсудим к комментах.

Добавить комментарий

Filtered HTML

  • Допустимые HTML-теги: <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd>
  • Строки и абзацы переносятся автоматически.
  • Web page addresses and email addresses turn into links automatically.