Кэш лака не кэширует PHP с сеансами Если бэкэнд не изменился TTL

Я новичок в Varnish Cache и задаюсь вопросом, надеюсь, что смогу помочь.

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

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

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

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 w / session для кеширования.

Мой полный default 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, чтобы, наконец, иметь кэш страниц в лаке.

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

Любые советы очень ценятся.

Спасибо!

С уважением.

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

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

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

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

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

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

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

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

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

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

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

Самый простой способ получить ответ, кэшированный лаком, – это добавить заголовок управления кешем.

PHP:

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

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

У меня была такая же проблема. Когда вы выполняете 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, но лучше безопасно, чем сожалеть.