Я новичок в 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, но лучше безопасно, чем сожалеть.