Как правильно настроить Лак для сайтов Symfony2?
У меня есть веб-сайт (с ESI), который использует обратный прокси-сервер Symfony2 для кеширования. Средний ответ составляет около 100 мс. Я попытался установить Varnish на сервер, чтобы попробовать. Я последовал за руководство из поваренной книги Symfony, удалив все в папке cache
, но папка http_cache
все еще была создана, когда я попробовал ее вне. Поэтому я решил, что могу попытаться прокомментировать $kernel = new AppCache($kernel);
от app.php
. Это сработало очень хорошо. http_cache
больше не создавался, и, по-лакнишстату, казалось, что работает лак:
12951 0.00 0.08 cache_hitpass - Cache hits for pass
1153 0.00 0.01 cache_miss - Cache misses
Это было около 14000 запросов, поэтому я подумал, что все будет в порядке. Но после эхопинга я обнаружил ответы, поднятые до ~ 2 секунд.
Apache работает на портах 9000 и Varnish на 8080. Поэтому я использую echooping используя echoping -n 10 -h http://servername/ X.X.X.X:8080
.
Я понятия не имею, что может быть неправильно. Есть ли дополнительные настройки, необходимые для использования Varnish с Symfony2? Или я просто делаю что-то не так?
В запросах здесь default.vcl
с изменениями, которые я сделал до сих пор.
Я обнаружил 2 проблемы с настройкой по умолчанию для Varnish:
- он не кэширует запросы с помощью куки файлов (и у всех в моем приложении назначена сессия)
- он игнорирует заголовок
Cache-Control: no-cache
Итак, я добавил условия для этих случаев в свой конфиг, и он работает довольно хорошо (~ 175 req/s от ~ 160 с обратным прокси S2, но, честно говоря, я ожидал, что бит больше). Я просто понятия не имею, как проверить, все ли установлено нормально, поэтому любые входы приветствуются.
В большинстве страниц кеш изменяется с помощью cookie с s-maxage
1200. Общие ESI не меняются cookie, а s-maxage
довольно низкий (статьи, списки статей). Страницы профиля пользователя не кэшируются вообще (no-cache
), и я не совсем уверен, что ESI включает в себя даже кэширование с помощью лака. Только ESI, который варьируется с помощью файлов cookie, - это заголовок с пользовательской информацией (на 100% страниц).
Все в этом посте - это Varnish 3.X(я лично использую 3.0.2).
Кроме того, через несколько недель в этом я не знаю, что я делаю, поэтому, если вы найдете что-то странное в конфигурациях, просто дайте мне знать.
![enter image description here]()
Ответы
Ответ 1
Я удивлен, что за 10 месяцев этого не было действительно полного ответа. Это может быть действительно полезной страницей.
Вы указали себе, что:
- Лак не кэширует запросы с помощью файлов cookie
- Varnish игнорирует Cache-Control: заголовок без кэша
Во-первых, всем, кто в вашем приложении нужен сеанс? Если нет, не запустите сеанс или, по крайней мере, запустите его, пока он не станет действительно необходимым (то есть они войдут в систему или что-то еще).
Если вы все еще можете кэшировать страницы, когда пользователи вошли в систему, вам нужно быть очень осторожными, чтобы вы не служили странице пользователя, предназначенной для кого-то другого. Но если вы собираетесь это сделать, отредактируйте vcl_recv(), чтобы удалить cookie сеанса для страниц, которые вы хотите кэшировать.
Вы можете легко получить лак для обработки директивы no-cache в vcl_fetch(), и на самом деле вы уже это сделали.
Другая проблема, которую я обнаружил, заключается в том, что Symfony по умолчанию устанавливает max-age в 0, а это значит, что они никогда не будут кэшироваться по умолчанию в vcl_fetch
Я также заметил, что у вас установлен порт в Varnish:
backend default {
.host = "127.0.0.1";
.port = "80";
}
Вы сами сказали, что Apache работает на порте 9000, так что это, похоже, не соответствует. Вы обычно устанавливали, чтобы Varnish прослушивал порт по умолчанию (80) и устанавливал Varnish для поиска бэкэнда на порте 9000 или что-то еще.
Ответ 2
Если ваша полная конфигурация, vcl_recv настроен дважды.
На страницах, которые вы хотите кэшировать, можете ли вы отправлять заголовки кеширования? Это будет иметь наибольший смысл, поскольку изображения, вероятно, уже имеют заголовки кеширования apache, и логика приложения решает страницы, которые могут быть на самом деле кэшированы, но вы также можете заставить это в лаке.
Вы можете использовать vcl_recv следующим образом:
# Called after a document has been successfully retrieved from the backend.
sub vcl_fetch {
# set minimum timeouts to auto-discard stored objects
# set beresp.prefetch = -30s;
set beresp.grace = 120s;
if (beresp.ttl < 48h) {
set beresp.ttl = 48h;}
if (!beresp.cacheable)
{pass;}
if (beresp.http.Set-Cookie)
{pass;}
# if (beresp.http.Cache-Control ~ "(private|no-cache|no-store)")
# {pass;}
if (req.http.Authorization && !beresp.http.Cache-Control ~ "public")
{pass;}
}
Это кэширует в лаке только те запросы, которые заданы для кеширования. Кроме того, имейте в виду, что ваша конфигурация не кэширует запросы с помощью файлов cookie.