Получение лака для работы на Magento - PullRequest
16 голосов
/ 17 февраля 2011

Сначала, пожалуйста, прости меня за полное непонимание лака.Это мой первый опыт работы с Varnish.

Я следую примеру на: http://www.kalenyuk.com.ua/magento-performance-optimization-with-varnish-cache-47.html

Однако при установке и запуске Varnish, похоже, не кешируется.Я получаю заголовок X-Varnish с одним номером и заголовок Via, который имеет значение 1,1 лака

Мне сказали (мой провайдер), что из-за следующего cookie-файла, который устанавливает Magento:

Set-Cookie: frontend=6t2d2q73rv9s1kddu8ehh8hvl6; expires=Thu, 17-Feb-2011 14:29:19 GMT; path=/; domain=XX.X.XX.XX; httponly

Они сказали, что я должен либо поменять Magento для этого, либо настроить Varnish для этого.Поскольку об изменении Magento не может быть и речи, мне было интересно, кто-нибудь может дать мне подсказку о том, как я сконфигурирую Varnish для обработки этого куки?

Ответы [ 7 ]

7 голосов
/ 25 мая 2011

http://moprea.ro/2011/may/6/magento-performance-optimization-varnish-cache-3/ описывает расширение Magento, которое включает полный кеш страниц с лаком. Это расширение опирается на конфигурацию Varnish, опубликованную на github.

Это уже реализованные функции:

  1. Конфигурация работоспособного лака
  2. Включите полное кэширование страниц с помощью Varnish, супербыстрого обратного прокси-сервера HTTP.
  3. Серверы Varnish настраиваются в Admin, в разделе Система / Конфигурация / Общие - Опции Varnish
  4. Автоматически очищает (только) кэшированные страницы при сохранении продуктов, категорий и страниц CMS.
  5. Добавляет новый тип кэша в Magento Admin, в разделе «Управление системой / кэш-памятью» и предлагает возможность деактивировать кэш и обновить кэш.
  6. Уведомляет администраторов о сохранении навигации по категориям и необходимости обновления кэша Varnish, чтобы меню обновлялось для всех страниц.
  7. Автоматически отключает кэш лака для пользователей, у которых есть товары в корзине или которые вошли в систему и т. Д.)
  8. Конфигурация лака по умолчанию предлагается для обеспечения работоспособности модуля. Снимки экрана: https://github.com/madalinoprea/magneto-varnish/wiki
6 голосов
/ 07 августа 2015

Как кэшировать Magento в Varnish (Теория) - это 2 компонента

1) Статические активы (например, Изображения, CSS, JS) - Это простой общий шаблон, который включает в себя обнаружение запросов, которыепринадлежат к этой категории и устанавливают время кэширования (или полагаясь на время кэширования, отправляемое исходным сервером) Пример этого в основной форме

2) HTML-документы - это оченьболее сложная часть хорошего решения Magento.Очень важно кэшировать HTML-документы в Varnish, чтобы повысить производительность Magento.Генерация HTML-документов - самая дорогая (трудоемкая) вещь, которую может сделать сервер Magento.

Проблема с кэшированием HTML-документов связана с персонализированным контентом.

Персонализированное содержимое и HTML-документы

Magento и все другие сайты электронной коммерции управляют состоянием определенного пользователя во время сеанса.Сессия - это запись статуса конкретного пользователя на вашем сайте.Сюда относятся такие вещи, как: «Привет, Боб» - вверху страницы «4 вещи в вашей корзине» - состояние вашей корзины покупок на каждой странице

Это элементы, которые нельзя разделить между пользователями ив этом случае возникнет серьезная проблема (мы называем это «утечкой сеанса»).

Как мы кэшируем HTML-страницы, если HTML-страницы содержат персонализированную информацию о том, кто этот человек и что находится в его корзине?

Существует 2 основных способа достижения этой цели: загрузка персонализированных элементов страницы с помощью дополнительных запросов после загрузки страницы. Обычный метод реализации здесь - использование AJAX для запроса персонализированных элементов страницы. Использование технологии для маркировкикомпоненты HTML-документа как кешируемые, так и другие не кешируемые (или не подлежащие обмену среди пользователей).Varnish поддерживает технологию ESI (Edge Side Includes), которая позволяет по-разному кэшировать различные части документа HTML.

Ваша стратегия реализации Varnish должна учитывать персонализацию пользователя.

Варианты реализации Varnish

Magento 1.X. Наиболее широко используемый метод для кэширования HTML-документов в Magento версии 1 - это продукт с открытым исходным кодом Magento Turpentine (от Nexus).Это плагин, который устанавливается (через Magento Connect) и автоматически добавляет теги ESI в ваши документы HTML, чтобы Varnish мог кэшировать эти ресурсы. Magento Turpentine install / guide

Magento 2.X - Последняя версия Magento (в настоящее время в бета-версии) поддерживает Varnish в качестве рекомендуемого решения для кэширования HTML в производстве.Это хорошая новость, Varnish является рекомендуемым вариантом от Magento и будет работать из коробки, чтобы улучшить скорость вашего сайта.

Как заставить Varnish и Magento работать хорошо

Развертывание - это одно,Следующие шаги после внедрения и работы решения Varnish Magento - понять, насколько хорошо оно работает.Получение метрик по частоте обращений к кешу и подробным журналам по запросу по запросу может быть проблемой, так как включает развертывание ряда дополнительных инфраструктур (или застревание при ручном сборе журналов на разовой основе).

Мынедавно создали эту инфраструктуру для запуска Varnish как службы в облаке (с полными журналами / метриками) - www.section.io - Отключите это - самый важный элемент для реального успеха с вами, Varnish иMagento проект, так как вам нужно постоянно настраивать свою реализацию, чтобы управлять такими вещами, как изменение строк запроса в URL-адресах (привет google analytics, gclid!), Которые могут значительно снизить частоту обращений в кеш

4 голосов
/ 11 января 2013

Если вы используете Varnish 3.0, возможно, вам придется изменить конфигурацию .vcl.Вот что я использую с magento и лаком 3:

    # This is a basic VCL configuration file for varnish.  See the vcl(7)
# man page for details on VCL syntax and semantics.
# 
# Default backend definition.  Set this to point to your content
# server.
# 
 backend default {
    .host = "127.0.0.1";
    .port = "8080";
 }

acl trusted {
    "127.0.0.1";
    "127.0.1.1";
    # Add other ips that are allowed to purge cache
}

# 
# http://www.varnish-cache.org/docs/2.1/tutorial/vcl.html#vcl-recv
# @param req    Request object
sub vcl_recv {
    if (req.http.x-forwarded-for) {
        set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip;
    }
    else {
        set req.http.X-Forwarded-For = client.ip;
    }

    if (req.request == "PURGE") {
        # Allow requests from trusted IPs to purge the cache
        if (!client.ip ~ trusted) {
           error 405 "Not allowed.";
        }
        ban("req.url ~ " + req.url);
        error 200 "Ok"; #We don't go to backend 
        #return(lookup); # @see vcl_hit
    }

    if (req.request != "GET" &&
       req.request != "HEAD" &&
       req.request != "PUT" &&
       req.request != "POST" &&
       req.request != "TRACE" &&
       req.request != "OPTIONS" &&
       req.request != "DELETE") {
         /* Non-RFC2616 or CONNECT which is weird. */
         return (pipe);
    }

     # Cache only GET or HEAD requests
     if (req.request != "GET" && req.request != "HEAD") {
         /* We only deal with GET and HEAD by default */
         return (pass);
     }

    # parse accept encoding rulesets to normalize
    if (req.http.Accept-Encoding) {
        if (req.http.Accept-Encoding ~ "gzip") {
            set req.http.Accept-Encoding = "gzip";
        } elsif (req.http.Accept-Encoding ~ "deflate") {
            set req.http.Accept-Encoding = "deflate";
        } else {
            # unkown algorithm
            remove req.http.Accept-Encoding;
        }
    }

     # Rules for static files
     if (req.url ~ "\.(jpeg|jpg|png|gif|ico|swf|js|css|gz|rar|txt|bzip|pdf)(\?.*|)$") {
        set req.http.staticmarker = "1";
        unset req.http.Cookie;

        return (lookup);
    }

    # Don't cache pages for Magento Admin
    # FIXME: change this rule if you use custom url in admin
    if (req.url ~ "^/(index.php/)?admin") {
        return(pass);
    }

    # Don't cache checkout/customer pages, product compare
  #  if (req.url ~ "^/(index.php/)?(checkout|customer|catalog/product_compare|wishlist)") {
  #      return(pass);
  #  }
    # Don't cache checkout/customer pages, product compare
    if (req.url ~ "/(checkout|customer|catalog/product_compare|wishlist)/") {
        return(pass);
    }


    # Don't cache till session end
    if (req.http.cookie ~ "nocache_stable") {
        return(pass);
    }

    # Unique identifier witch tell Varnish use cache or not
    if (req.http.cookie ~ "nocache") {
        return(pass);
    }

    # Remove cookie 
    unset req.http.Cookie;
    set req.http.magicmarker = "1"; #Instruct varnish to remove cache headers received from backend
    return(lookup);
 }


sub vcl_pipe {
#     # Note that only the first request to the backend will have
#     # X-Forwarded-For set.  If you use X-Forwarded-For and want to
#     # have it set for all requests, make sure to have:
#     # set req.http.connection = "close";
#     # here.  It is not set by default as it might break some broken web
#     # applications, like IIS with NTLM authentication.
     return (pipe);
}

#sub vcl_pass {
#     return (pass);
#}

#sub vcl_hash {
#     set req.hash += req.url;
#     if (req.http.host) {
#         set req.hash += req.http.host;
#     } else {
#         set req.hash += server.ip;
#     }
#     return (hash);
# }


# Called after a cache lookup if the req. document was found in the cache.
sub vcl_hit {
    if (req.request == "PURGE") {
        ban_url(req.url);
        error 200 "Purged";
    }

    #
    # ATTENTION!! I had to comment this to make it work on vernish 3.0!!!!
    # error message:
    # Symbol not found: 'obj.cacheable' (expected type BOOL):
    #
    # I'm not sure about it, please check!!!
    #
    #if (!obj.cacheable) {
    #    return (pass);
    #}


    return (deliver);
}

# Called after a cache lookup and odc was not found in cache.
sub vcl_miss {
    if (req.request == "PURGE"){
        error 200 "Not in cache";
    }
    return (fetch);
}

# Called after document was retreived from backend
# @var req      Request object.
# @var beresp   Backend response (contains HTTP headers from backend)
sub vcl_fetch {
    set req.grace = 30s;

    # Current response should not be cached
    if(beresp.http.Set-Cookie ~ "nocache=1") {
        return (deliver);
    }

    # Flag set when we want to delete cache headers received from backend
    if (req.http.magicmarker){
        unset beresp.http.magicmarker;
        unset beresp.http.Cache-Control;
        unset beresp.http.Expires;
        unset beresp.http.Pragma;
        unset beresp.http.Cache;
        unset beresp.http.Server;
        unset beresp.http.Set-Cookie;
        unset beresp.http.Age;

        # default ttl for pages
        set beresp.ttl = 1d;
    }
    if (req.http.staticmarker) {
        set beresp.ttl = 30d; # static file cache expires in 30 days
        unset beresp.http.staticmarker;
        unset beresp.http.ETag; # Removes Etag in case we have multiple frontends
    }

    return (deliver);
}

# Called after a cached document is delivered to the client.
sub vcl_deliver {
    if (obj.hits > 0) {
        set resp.http.X-Cache = "HIT ("+obj.hits+")";
    } else {
        set resp.http.X-Cache = "MISS";
        #    set resp.http.X-Cache-Hash = obj.http.hash;
    }
    return (deliver);
}
# 
# sub vcl_error {
#     set obj.http.Content-Type = "text/html; charset=utf-8";
#     synthetic {"
# <?xml version="1.0" encoding="utf-8"?>
# <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
#  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
# <html>
#   <head>
#     <title>"} obj.status " " obj.response {"</title>
#   </head>
#   <body>
#     <h1>Error "} obj.status " " obj.response {"</h1>
#     <p>"} obj.response {"</p>
#     <h3>Guru Meditation:</h3>
#     <p>XID: "} req.xid {"</p>
#     <hr>
#     <address>
#        <a href="http://www.varnish-cache.org/">Varnish cache server</a>
#     </address>
#   </body>
# </html>
# "};
#     return (deliver);
# }
3 голосов
/ 20 мая 2011

Я предполагаю, что это сессионный cookie, который Magento отправляет всем пользователям - у меня была похожая проблема с Varnish + Redmine.

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

Однако многие фреймворки предоставляют сеансовые куки-файлы пользователям, которые также не вошли в систему.Боюсь, я совсем не знаю Magento, поэтому не могу предсказать последствия игнорирования этого cookie - в Redmine игнорирование cookie означало, что пользователи не могли войти в систему, и все формы перестали работать (потому что у них больше не было CSRF).токен).

Вероятно, было бы лучше заняться этим со стороны Magento, если вы можете - Varnish прослушает заголовки вышестоящего потока, чтобы определить, что можно кэшировать и т. д.

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

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

† ТамЭто исключение, которое, если вы используете , включает в себя .

0 голосов
/ 28 октября 2012

Это, я думаю, объясняет, как мы могли бы покончить с использованием лака с magento

Если вы используете модуль aoe_static и мой пользовательский vcl для лака 3, он очищает куки в ответе на кешированной странице. Это должно сделать это в vcl fetch. Затем куки могут быть установлены из меньшего отклика Ajax, который загружает динамический контент. Это поддерживает ваши сеансы, корзину и т. Д. Этот ответ ajax может быть «передан» в vcl recovery.

У меня не возникало проблем с этим, но я не пробовал это на рабочей площадке.

Динамические блоки должны быть заменены местозаполнителями через макет XML. Если вам понравились эти замены, вы можете использовать краевую часть лака или пользовательскую реализацию ajax.

При загрузке динамического контента из aoe_static (или любого другого типа ajax-методов, который вы предпочитаете) хорошо помнить, что вы все еще можете использовать систему макетов magentos, например, создайте дескриптор для вашего вызова ajax с вложенными блоками, которые будут отображаться.

Если вы используете модуль aoe_static, вы заметите, что вызывается loadLayout, но помните, какие дескрипторы передаются этому loadLayout. это не то же самое, что запрос макета страницы, на которой вы находитесь, но он получает дескриптор по умолчанию для вас.

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

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

В модуле phoenix есть методы, выполняющие такие виды очистки, если вы хотите увидеть простую реализацию, просто выполняемую наблюдателями.

Но как работать с многослойными навигационными URL-адресами более сложно. вам нужно будет сохранить параметры строки запроса, которые приложение обслуживало, используя URL-адрес списка базовой категории в качестве ключа, а затем прочитать и удалить эти URL-адреса в обозревателе. Такое сохранение параметров строки запроса было бы достаточно простым, используя ответ перед отправкой, проверяя объект запроса с помощью регулярного выражения и регистрируя строки запроса, разделенные запятой.

Я ошибаюсь, полагая, что ни один из текущих модулей не имеет дело с уровнями запасов для многоуровневой навигации?

Я думаю, что хороший готовый модуль для лака необходим в сообществе открытого исходного кода, так как все остальные отсутствуют. лично я планирую использовать только платные полные страницы кеша с серверами с балансировкой нагрузки и, возможно, лаком, чтобы ловить изображения и запросы CSS. Если кто-то не захочет объединить усилия для создания правильной реализации лака, или я буду рад помочь с проблемами для ваших сайтов, если работа может быть добавлена ​​к реализации с открытым исходным кодом, которая лучше решает все эти проблемы.

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

0 голосов
/ 14 мая 2011

Мы разработали модуль под названием PageCache на основе Varnish, который позволяет Magento и Varnish беспрепятственно играть вместе, предоставляя хорошо протестированный файл конфигурации Varnish (VCL) и плотно интегрированный модуль Magento с большим количеством опций для управления скоростью Varnish от Magento. бэкенд. Проверьте это на Magento Connect:

http://www.magentocommerce.com/magento-connect/Phoenix/extension/6322/varnish_cache

0 голосов
/ 20 февраля 2011

http://moprea.ro/2011/feb/16/magento-performance-optimization-varnish-cache-2/

Не уверен, поможет ли это, но я случайно натолкнулся на это.

Я уже пытался заставить лак работать, и мне это не удалось.Я бы посоветовал вам получить APC + Memcached + tmpfs session / cache перед тем, как попробовать лак.

...