Varnish Cache не кэширует PHP с помощью сессий, если бэкэнд TTL не изменен - PullRequest
4 голосов
/ 29 марта 2011

Я новичок в Varnish Cache и у меня есть вопрос, который, я надеюсь, мне поможет.

У меня очень простая и базовая настройка, но она не работает, как я понимаю, по какой-то причине.

Это связано с тем, что Varnish не кэширует страницы PHP, использующие куки.

Вот мои настройки:

1) Для моего default.vcl у меня есть простой бэкэнд

backend default {
.host = "127.0.0.1";
.port = "80";
}

2) У меня есть простой файл PHP, который имеет только эти две строки:

session_start();
echo time();

3) Когда я вызываю эту страницу, она правильно не кэшируется, так как я не добавила внеобходимые правила vcl

4)

Так что, согласно моему пониманию документации, я добавляю в эти два правила

sub vcl_recv {
unset req.http.Cookie;
return (lookup);
}

sub vcl_fetch {
unset beresp.http.Set-Cookie;
return(deliver);
}

5) Страница PHP по-прежнему не будет кэшироваться.Я вижу, что заголовок Set-Cookie был удален, так как я использую FireBug в FireFox.

Только если я добавлю это в sub vcl_fetch, PHP будет кешировать:

set beresp.ttl = 24h;

Мой вопрос - это правильно?

Я не думал, что мне нужно будет изменить ttl ответа сервера.Я думал, что просто сброс и отключение файлов cookie приведет к кешированию PHP с сеансом.

Мой полный vcl по умолчанию:

backend default {
.host = "127.0.0.1";
.port = "80";
}

sub vcl_recv {
unset req.http.Cookie;
return (lookup);
}

sub vcl_fetch {
unset beresp.http.Set-Cookie;
set beresp.ttl = 24h;
return(deliver);
}

Моя команда запуска:

varnishd -f /etc/varnish/default.vcl -s malloc,128M -T 127.0.0.1:2000 -a 0.0.0.0:8080

URL-адрес, по которому я звоню:

http://vbox.local:8080/varnish-tests/index.php

В моем файле index.php есть только:

<?php 
session_start();
echo time();

Я хотел бы спросить сообщество, правильно ли это выглядит илия не правПо сути, я просто не уверен, почему мне пришлось добавить beresp.ttl = 24h, чтобы наконец получить кэш страницы в лаке.

Я думал, что мне это не понадобится.

Любой совет очень ценится,

Спасибо!

С уважением.

Ответы [ 5 ]

5 голосов
/ 30 октября 2012

Varnish будет подчиняться заголовкам кэширования в ответе.PHP отправит заголовки управления кэшем НЕ для кэширования ответа по умолчанию

Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma:no-cache

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

session_cache_limiter('');
header("Cache-Control: public, s-maxage=60");
session_start();

Затем вы можете добавить заголовок, чтобы установить элемент управления кэширования для public.Использование трех приведенных выше строк включит кеширование.

4 голосов
/ 13 января 2012

Как сказал ZoFreX, это возможно из-за вашего заголовка Cache-Control или Expires.

Также обратите внимание, что это правило немного опасно:

sub vcl_recv {
    unset req.http.Cookie;
    return (lookup);
}
sub vcl_fetch {
    unset beresp.http.Set-Cookie;
    return(deliver);
}

Если ваш сервер отправляет файлы cookie, возможно, вам они нужны, по крайней мере, для сеансов. Такое правило полностью отключит управление сессиями вашего сервера приложений.

В зависимости от того, почему вы используете сеансы, вы не можете кэшировать каждую часть вашего контента (например, пользовательский контент).

1 голос
/ 30 ноября 2011

Самый простой способ получить ответ, кэшированный с помощью лака, - добавить заголовок cache-control.

PHP:

header('Cache-Control: public, s-maxage=60');

скажет лаку кэшировать ответ в течение 60 секунд.

1 голос
/ 20 мая 2011

Вы должны очень внимательно посмотреть на заголовки, которые PHP отправляет в Varnish (например, путем прямого доступа к вашему серверу, а не через varnishd).Если заголовки говорят, что содержимое не может быть кэшировано, этого не произойдет.Если они не говорят, что он может быть кэширован, этого не произойдет - и я подозреваю, что именно поэтому Varnish кэширует только если вы вручную установите ttl, так как заголовки не имеют «expires» или «max-age»».

0 голосов
/ 24 октября 2012

У меня была точно такая же проблема.Когда вы выполняете сеанс session_start, кажется, что PHP замечает, что страница является потенциально динамической, и услужливо сбрасывает заголовки элемента управления кэшем следующим образом:

Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma:no-cache

Конфигурация Varnish по умолчанию подчиняется этим директивам кэширования, отправленным apache / phpЭто означает, что эти страницы не будут кэшироваться.Я не уверен на 100%, что можно переопределить конфигурацию по умолчанию либо только для ее расширения.

Обходной путь, который я использовал, - это переустановить заголовки Cache-Control, но учтите, что этодолжно быть сделано после того, как session_start изменил их.Я не проверял, должен ли он также быть после session_write_close, но лучше, чем потом сожалеть.

...