Как правильно настроить Varnish для сайтов Symfony2? - PullRequest
31 голосов
/ 19 января 2012

У меня есть веб-сайт (с ESI), который использует обратный прокси-сервер Symfony2 для кэширования.Средний ответ составляет около 100 мс.Я попытался установить Varnish на сервере, чтобы попробовать.Я шаг за шагом следовал руководству из поваренной книги Symfony , удалял все в папке cache, но папка http_cache все еще создавалась, когда я ее пробовал.Поэтому я решил, что могу попытаться закомментировать $kernel = new AppCache($kernel); из app.php.Это сработало довольно хорошо.http_cache больше не был создан, и Varnish, похоже, работал:

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. Поэтому я выполняю эхопинг с использованием echoping -n 10 -h http://servername/ X.X.X.X:8080.

Я понятия не имею, что может бытьнеправильно.Есть ли дополнительные настройки, необходимые для использования Varnish с Symfony2?Или я просто что-то делаю не так?


По запросам, вот мой default.vcl с изменениями, которые я сделал до сих пор.

Я обнаружил 2 проблемыс конфигурацией по умолчанию Varnish:

  • он не кэширует запросы с куки (и каждому в моем приложении назначен сеанс)
  • он игнорирует Cache-Control: no-cache header

Таким образом, я добавил условия для этих случаев в свою конфигурацию, и теперь она работает довольно хорошо (~ 175 запросов / с по сравнению с ~ 160 с обратным прокси-сервером S2 - но, честно говоря, я ожидал немного большего).Я просто понятия не имею, как проверить, все ли в порядке, поэтому любые входные данные приветствуются.

Большинство страниц имеют кэш, изменяемый в зависимости от cookie, с s-maxage 1200. Общие включения ESI не изменяются в зависимости от cookie, с s-maxage довольно низким (статьи, списки статей).Страницы профиля пользователя вообще не кэшируются (no-cache), и я не совсем уверен, что ESI включает в них даже кэшируется Varnish.Только ESI, который варьируется по файлам cookie, является заголовком с пользовательской информацией (это на 100% страниц).

Все в этом посте относится к Varnish 3.X (лично я использую 3.0.2).

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

enter image description here

Ответы [ 2 ]

18 голосов
/ 13 декабря 2012

Я удивлен, что у него не было действительно полного ответа за 10 месяцев.Это может быть действительно полезная страница.

Вы сами отметили, что:

  • Varnish не кэширует запросы с помощью cookie
  • Varnish игнорирует Cache-Control: нет-cache header

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

Если вы все еще можете кэшировать страницы, когда пользователи входят в систему, вам необходимобудьте очень осторожны, вы не предоставляете пользователю страницу, предназначенную для кого-то другого.Но если вы собираетесь это сделать, отредактируйте vcl_recv (), чтобы удалить cookie-файл сеанса для страниц, которые вы хотите кэшировать.

Вы можете легко заставить Varnish обрабатывать директиву 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 или чем-то еще.

1 голос
/ 03 февраля 2012

Если это вся ваша конфигурация, 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.

...