Как правильно настроить Лак для сайтов 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.