Назад | Перейти на главную страницу

Как кэшировать веб-сайты с помощью Varnish, PHP и файлов cookie

Я думаю начать использовать Varnish на своих сайтах. Я только что попробовал Varnish, и мне интересно, как кэшировать страницы, даже если мои веб-сайты используют файлы cookie для Google Analytics. Я пытаюсь удалить их, но похоже, что Varnish не кешируется. Так выглядит моя конфигурация; http://pastie.org/1254664. Если это важно, у меня есть один сервер Debian и один сервер с Ubuntu Server. Итак, как мне кэшировать сайт, даже если я использую файлы cookie?

Заранее спасибо!

Дополнение: у меня тоже нет X-Cache: HIT / MISS. Что я делаю не так?

Я новичок в кэшировании с помощью Varnish, но вот что я узнал до сих пор. При использовании Varnish для кэширования в приложении необходимо учитывать несколько факторов.

В вашем случае знайте, какие файлы cookie устанавливаются и с какой целью. Если varnish видит cookie с вашим запросом, вы будете переданы на бэкэнд, что приведет к промаху кеша.

Файлы cookie Google Analytics

Если вы используете файлы cookie Google Analytics, вы можете безопасно отключить их в Varnish; не волнуйтесь, у вас останутся данные в отчетах GA. Используйте что-то подобное в своем vcl_recv

set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(__[a-z]+|__utma_a2a)=[^;]*", "");

Вы можете попробовать еще пару строк очистки, также в vcl_recv

Удалять ";" префиксы из файлов cookie

set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", "");

Отключить пустые куки

if (req.http.Cookie ~ "^\s*$") {
  unset req.http.Cookie;
}

Файлы cookie для конкретных приложений

Если ваше приложение устанавливает cookie, когда пользователь входит в систему для выполнения функции, эти запросы должны не кэшироваться и напрямую отправляться на серверную часть. В противном случае вы могли бы кешировать страницы, просматриваемые авторизованными пользователями (плохо).

Используйте что-то вроде этого:

if (req.http.Authorization || req.http.Cookie) {
  return (pass);
}

HTH и удачи.

редактировать

Используйте это, чтобы увидеть, через что проходит лак для печенья:

varnishtop -i RxHeader -I Cookie

Если в вашем регулярном выражении что-то отсутствует, поймайте их здесь!

Вот для чего нужен заголовок Vary в http: варианты, которые должны возвращать один и тот же ресурс. Лак понимает Vary: cookies.

Если вы не получаете заголовки X-Cache, возможно, вы вообще не подключаетесь к кешу; вы уверены, что он работает на правильном ip / порту?

Не знаю насчет Лака. Но согласно моему опыту в администрировании серверов, сначала попробуйте все это в своей локальной сети, а не переходите в Интернет.

Вы можете передать некоторые части вашего сайта в бэкэнд без кеширования.

Самый простой пример для блоков vcl_recv и vcl_fetch:

sub vcl_recv {
if (req.url ~ "^/somescript.php") {                       
return (pass);                                                          
}                                                                       
else {                                                                  
unset req.http.Cookie;                                                  
}
return(lookup);
}

sub vcl_fetch {
if (req.url ~ "^/somescript.php") {                       
return (pass);                                                          
}                                                                       
else {                                                                  
unset req.http.Cookie;                                                  
}
return(deliver);
}

Читать - прочитайте это чтобы понять, почему не хватает Лака

бегать лак и посмотрите, действительно ли вы проходите через лак

Я рекомендую проверить, для каких URL-адресов вам действительно нужны файлы cookie (например, панель администрирования), и удалить файлы cookie для всех остальных URL-адресов. См. Пример ниже:

sub vcl_recv {
  if (req.url ~ "^/admin/") {
    # administration panel
    set req.http.admin = 1;
  } else {
    # public web site, ignore client request for fresh content, remove cookies
    unset req.http.Cache-Control;
    unset req.http.Max-Age;
    unset req.http.Pragma;
    unset req.http.Cookie;
  }
  ...
}

sub vcl_fetch {
  if (req.http.admin == 1) {
    # administration panel
    return (hit_for_pass);
  } else {
    # public web site, not allowed to set cookies
    unset beresp.http.Set-Cookie;
    ...
  }
  ...
}