Объяснение оптимизации производительности Magento

Опубликовано: 2022-03-11

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

В этой статье я представлю несколько способов, с помощью которых разработчики Magento могут оптимизировать свою установку Magento 2, и объясню, как сделать следующее:

  • Проверяйте сторонние модули и находите узкие места
  • Включить полностраничный кеш
  • Лак, а не файлы для полностраничного кеша
  • Убедитесь, что полностраничный кеш работает, его так легко сломать.
  • Включить производственный режим
  • Минификация CSS/JS
  • Включить плоские таблицы
  • Получите самый быстрый хостинг, который вы можете себе позволить
  • Оптимизация изображений
  • Индексаторы для «обновления по расписанию»
  • GZIP-сжатие
  • Используйте Elasticsearch на страницах каталога и в поиске.
  • Проверьте наличие ненужных вызовов Ajax на сервер после загрузки страницы (может вызвать блокировку сеанса).
  • Redis для кеша страниц и хранения сеансов

Проверяйте сторонние модули и находите узкие места

Существует множество сторонних модулей Magento с плохим кодом, использующих устаревшие методы или имеющие проблемы совместимости с последней стабильной версией Magento. Лучший способ определить тяжелые запросы — использовать профайлер. Это поможет вам определить, сколько запросов MySQL у вас есть на странице и сколько из них идентичны. Зная это, вы можете объединить эти запросы в один и, таким образом, ускорить Magento.

Одна из главных ошибок младших разработчиков в Magento — это загрузка моделей внутри циклов. Старайтесь избегать этого, насколько это возможно. Загрузите всю коллекцию всем, что вам нужно, а затем прокрутите ее. Всегда помните о временной и пространственной сложности и оптимизируйте свой алгоритм.

График производительности Magento

Посмотрите, как загружается ваш макет и какие блоки шаблона работают медленнее всего, а затем изучите этот код. Изучите метрики Model CRUD, где вы можете найти полезные данные, такие как вызовы загрузки в циклы.

Полностраничный кэш Magento

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

Использование полностраничного кеша в рамках ваших усилий по оптимизации Magento может значительно увеличить скорость вашего сайта. Это создаст кешированные версии ваших страниц и доставит их пользователю вместо того, чтобы выполнять все запросы для каждого запроса. Конечно, не все страницы кэшируются. Например, страница корзины не будет кэшироваться, иначе все пользователи увидят первую кешированную версию страницы. Это динамические страницы или разделы страниц, которые зависят от пользователя и сеанса.

Чтобы включить полностраничный кеш Magento, вы можете запустить следующую команду CLI:

php bin/magento cache:enable full_page

Чтобы включить типы кеша, вы можете запустить команду CLI:

php bin/magento cache:enable

Вы также можете сделать это из Magento Admin, войдя в систему как администратор:

  1. Перейдите в « Система» > « Инструменты » > « Управление кешем ».
  2. Выберите тип кэша , который вы хотите активировать.
  3. В раскрывающемся списке « Действия » выберите « Включить» и нажмите « Отправить» .

Скриншот оптимизации производительности Magento

Используйте Varnish для полностраничного кэша

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

Вы можете найти полное руководство по установке и настройке Varnish в официальной документации Magento 2.

Чтобы настроить Magento для использования Varnish, войдите в админку Magento как администратор:

  1. Перейдите в « Магазины » > « Конфигурация » > « Дополнительно » > « Система» > « Полный кэш страниц ».
  2. В списке приложений кэширования выберите Varnish Caching.
  3. Введите значение в поле TTL для общедоступного контента .
  4. Разверните Varnish Configuration и введите конкретную информацию о вашей конфигурации Varnish.

Скриншот полностраничного кеша оптимизации производительности Magento

Убедитесь, что полностраничный кэш работает: его легко сломать

Полностраничный кеш можно легко взломать в Magento 2. Например, если вы хотите исключить блок из кеша, не используйте атрибут cacheable="false" в макете XML при объявлении вашего блока. Это отключит кеш для всей страницы, содержащей этот блок, а не только для этого блока. Это ошибка, которую я видел, как люди делают.

Найдите cacheable="false" в своих макетах и ​​посмотрите, на каких блоках они установлены и на каких страницах эти блоки вызываются. Таким образом, вы можете определить, есть ли у тривиальных страниц проблемы с кешем.

Вы также можете проверить, кэшируется ли ваша страница вручную. Переведите магазин в режим разработчика в вашей локальной или рабочей среде:

  1. Очистить кеш Magento
  2. Загрузите страницу в браузере
  3. Проверьте заголовки страниц на вкладке отладки сети вашего браузера.
  4. Ищите X-Magento-Cache-Debug: MISS
  5. Обновите страницу, она должна измениться на HIT

Если он не меняется на HIT, это означает, что страница не кэшируется и кэш не работает.

Не забудьте включить режим производства

Magento имеет три режима работы: по умолчанию , режим разработчика и рабочий режим.

Производственный режим предназначен для развертывания в производственной системе. Этот режим скрывает исключения, обслуживает статические файлы только из кеша и не позволяет вам включать или отключать типы кеша в Magento Admin. Это также предотвращает автоматическую компиляцию файла кода.

Во время работы и развития магазина активен режим разработчика. Не забудьте переключиться в рабочий режим при развертывании сайта на рабочем сервере!

Команда CLI для просмотра текущего режима:

php bin/magento deploy:mode:show

Команда CLI для переключения в рабочий режим:

php bin/magento deploy:mode:set production

Команда CLI для переключения в режим разработчика:

php bin/magento deploy:mode:set developer

Вы можете найти более подробную информацию о различных режимах Magento здесь.

Минификация CSS/JS

Минимизация файлов CSS и JS — важный элемент оптимизации скорости Magento 2. Минимизируя их, мы удаляем все пробелы, табуляции и новые строки в файлах. Полученные файлы будут иметь меньше символов и, следовательно, меньший размер, поэтому они будут загружаться быстрее.

В Magento эта функция встроена, и вы можете включить минимизацию CSS/JS в панели администратора. Чтобы включить минимизацию JavaScript, выполните следующие действия:

  1. перевести Magento в производственный режим
  2. Перейдите в « Магазины » > « Конфигурация » > « Дополнительно » > « Разработчик ».
  3. Установите для параметра «Минимизировать файлы Javascript» значение « Да ».
  4. Сохранить конфигурацию
  5. Очистите кэш на странице « Система» > «Управление кешем».

Скриншот производственного режима Magento

Чтобы включить минимизацию CSS, необходимо выполнить следующие шаги:

  1. перевести Magento в производственный режим
  2. Перейдите в « Магазины » > « Конфигурация » > « Дополнительно » > « Разработчик » > «Настройки CSS ».
  3. Установите для параметра «Минимизировать файлы CSS» значение « Да ».
  4. Сохранить конфигурацию
  5. Очистите кэш на странице « Система» > «Управление кешем».

Скриншот минимизации Magento CSS

Примечание. Не объединяйте файлы JS — просто уменьшите их .

Включить плоские таблицы

Magento использует модель EAV (значение атрибута объекта), которая хранит атрибуты своих объектов в нескольких таблицах в зависимости от типа их значения. Использование нескольких таблиц, объединение и запросы к нескольким таблицам необходимы для извлечения данных, что может замедлить запросы.

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

Magento создает и обновляет плоские таблицы при каждой индексации. Вы можете включить плоские таблицы, войдя в Magento Admin как администратор:

  1. Перейдите в « Магазины » > « Конфигурация » > « Каталог » > « Каталог » > «Витрина ».
  2. Выберите Да для использования категории плоского каталога.
  3. Выберите « Да» для использования плоского продукта каталога.
  4. Сохранить конфигурацию

Скриншот плоских таблиц Magento

Выберите быстрый хостинг Magento

Ознакомьтесь с минимальными требованиями Magento и посмотрите, соответствует ли им ваш сервер. Вы можете ознакомиться с официальными требованиями к технологическому стеку Magento 2.2.x здесь.

Конфигурация хостинга очень важна для производительности Magento 2. Существуют также специальные услуги хостинга для Magento, хотя они могут быть больше связаны с маркетингом, чем с чем-либо еще.

Итог: получите самое быстрое решение для хостинга, которое вы можете себе позволить, если только оно не является излишним для вашего проекта.

Оптимизация изображений Magento

Размер ваших изображений, очевидно, влияет на скорость вашего сайта. Например, если у вас есть страница каталога с 20 продуктами и каждое изображение продукта имеет размер 1 МБ, это означает, что при загрузке страницы будет загружено в общей сложности 20 МБ, и это, очевидно, может быть проблемой в некоторых сценариях (мобильные устройства, ограниченная пропускная способность в определенных регионах и т. д.).

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

Другой метод — использовать ленивую загрузку, что означает загрузку изображений после полной загрузки страницы или во время прокрутки пользователем каталога.

Вы также можете использовать AWS или CDN для более быстрой доставки контента. Давайте кратко рассмотрим различия между AWS, CDN и традиционным хостингом с точки зрения оптимизации растровых изображений.

Традиционный хостинг

Традиционный способ — хранить ваш контент, например изображения, на том же сервере, что и ваш сайт. Это может занимать место на диске и большую часть вашей пропускной способности, создавая значительную нагрузку на сервер. Очевидно, что масштабирование с помощью традиционного хостинга может быть проблемой.

CDN (сеть доставки контента)

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

AWS (Amazon CloudFront)

Amazon CloudFront — это высокозащищенная сеть доставки контента (CDN), обеспечивающая защиту как на уровне сети, так и на уровне приложений. Ознакомьтесь с этим руководством, чтобы узнать, как начать работу с AWS и быстрее доставлять контент.

Кроме того, вы можете использовать AWS для изменения размера изображений на лету на основе размеров, переданных через параметр запроса. Дополнительные сведения см. в этом руководстве по изменению размера изображений с помощью Amazon CloudFront и Lambda@Edge.

Установите для индексаторов значение «Обновление по расписанию».

Индексаторы Magento могут быть установлены в два режима: « Обновление при сохранении » или « Обновление по расписанию ».

Когда для них установлено значение «Обновлять при сохранении», каждый раз, когда вы сохраняете продукт, атрибут или категорию, запускается определенный индекс. Индексаторы могут потреблять ресурсы, что может замедлить работу вашего сервера.

Лучший режим для установки индексаторов — «Обновление по расписанию». Таким образом, вы уверены, что они выполняются заданием cron в определенное время, которое вы установили. Выберите время, когда трафик на вашем сайте низкий.

Вы можете просмотреть текущий режим индексаторов, выполнив команду:

php bin/magento indexer:show-mode

Или в Magento Admin, перейдя по ссылке:

Система > Управление индексами

Вы можете изменить режим индексаторов на «Обновление по расписанию», выполнив команду:

php bin/magento indexer:set-mode schedule

Вы можете изменить режим индексаторов на «Обновление при сохранении», выполнив команду:

php bin/magento indexer:set-mode realtime

А вот это в Magento Admin:

Система > Управление индексами: выберите все индексаторы и в раскрывающемся списке « Действия » выберите «Обновлять по расписанию».

альтернативный текст изображения

Вы также можете настроить запланированные задачи, зайдя в Admin, чтобы:

Магазин > Настройки > Конфигурация > Дополнительно > Система > Cron (запланированные задачи)

Разверните «Параметры конфигурации Cron для группы: индекс»

Диалоговое окно конфигурации Magento cron

GZIP-сжатие

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

При сжатии файла вы нагружаете ЦП, и чем больше вы сжимаете файл, тем больше времени занимает процесс. Несмотря на то, что это может увеличить нагрузку на ЦП сервера, это также может существенно снизить использование полосы пропускания. С помощью gzip вы можете выбирать между различными уровнями сжатия от 1 до 9.

На уровне 1 у вас самое быстрое время сжатия, но более низкая степень сжатия. С другой стороны, на уровне 9 у вас самая высокая степень сжатия, но более низкая скорость. Конфигурация gzip по умолчанию использует уровень 6, отдавая предпочтение сжатию, а не скорости. Однако Nginx использует уровень 1, отдавая предпочтение скорости, а не размеру файла.

Чтобы включить сжатие gzip и активировать модуль mod_deflate Apache, вы можете добавить это, обновив файл .htaccess и раскомментировав соответствующие строки, как показано ниже. Модуль mod_deflate сжимает статические ресурсы в файлы меньшего размера перед их передачей в браузер.

 <IfModule mod_deflate.c> ############################################ ## enable apache served files compression ## http://developer.yahoo.com/performance/rules.html#gzip # Insert filter on all content SetOutputFilter DEFLATE # Insert filter on selected content types only AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/x-javascript application/json image/svg+xml # Netscape 4.x has some problems... BrowserMatch ^Mozilla/4 gzip-only-text/html # Netscape 4.06-4.08 have some more problems BrowserMatch ^Mozilla/4\.0[678] no-gzip # MSIE masquerades as Netscape, but it is fine BrowserMatch \bMSIE !no-gzip !gzip-only-text/html # Don't compress images SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary # Make sure proxies don't deliver the wrong content Header append Vary User-Agent env=!dont-vary </IfModule>

Используйте Elasticsearch на страницах каталога и в поиске

Еще один способ увеличить скорость вашего сайта — использовать Elasticsearch для страниц каталога и результатов поиска. Настройте свой сервер Elasticsearch и подключите к нему свой магазин Magento. Поиск становится намного быстрее с помощью Elasticsearch.

В этом официальном руководстве объясняется, как настроить Magento с помощью Elasticsearch.

Чтобы настроить Magento для использования Elasticsearch, войдите в админку Magento как администратор:

  1. Нажмите «Магазины » > «Настройки » > «Конфигурация » > «Каталог » > «Каталог » > «Поиск по каталогу».
  2. В списке поисковой системы выберите Elasticsearch или Elasticsearch 5.0+ , как показано на следующем рисунке. (Вариант Elasticsearch 5.0+ недоступен для Magento 2.1.)

Настройка Elasticsearch в Magento

Проверка на ненужные вызовы Ajax

Обратные вызовы на сервер после загрузки страницы могут привести к блокировке сеанса. Чтобы проверить все вызовы Ajax, которые выполняет ваша страница, используйте DevTools в Chrome. Вы можете открыть его, щелкнув правой кнопкой мыши на странице и выбрав «Проверить».

Перейдите на вкладку сети и там вы сможете отфильтровать запрос по XHR. Теперь вы можете увидеть все Ajax-запросы страницы и проверить, какие из них необходимы на этой конкретной странице.

Ajax звонит в Magento

Redis для кеша страниц и хранения сеансов

Redis — это дополнительное решение для внутреннего кэширования, заменяющее Zend_Cache_Backend_File , которое по умолчанию используется в Magento 2.

Зачем использовать Redis?

Использование Redis может иметь несколько преимуществ:

  • Вы можете заменить memcached на Redis, потому что его также можно использовать для хранения сеансов PHP.
  • Redis поддерживает сохранение на диске и репликацию master/slave, что является очень востребованной функцией, которая не поддерживается memcached. Репликация позволяет избежать единой точки отказа и обеспечивает высокую доступность.
  • Операции с тегами не требуют полного сканирования каждого файла кеша, поскольку Redis работает путем индексации тегов в файлах.
  • Серверная часть поддерживает очистку кэша на основе тегов без циклов foreach.

Есть и главный минус:

  • Поскольку Redis — это хранилище в памяти, все ваши данные должны помещаться в памяти, а это означает, что они ограничены только скоростью и емкостью ОЗУ.

Настройте Magento для использования Redis для хранения сеансов.

Ниже приведен пример конфигурации для добавления в <your Magento install dir>app/etc/env.php :

 'session' => array ( 'save' => 'redis', 'redis' => array ( 'host' => '127.0.0.1', 'port' => '6379', 'password' => '', 'timeout' => '2.5', 'persistent_identifier' => '', 'database' => '2', 'compression_threshold' => '2048', 'compression_library' => 'gzip', 'log_level' => '1', 'max_concurrency' => '6', 'break_after_frontend' => '5', 'break_after_adminhtml' => '30', 'first_lifetime' => '600', 'bot_first_lifetime' => '60', 'bot_lifetime' => '7200', 'disable_locking' => '0', 'min_lifetime' => '60', 'max_lifetime' => '2592000' ) ),

Вы можете проверить здесь все подробности о параметрах и о том, как выполнить базовую проверку того, что ваша установка Redis работает нормально вместе с вашим Magento.

Настройте Magento для использования Redis для страницы и кеша по умолчанию

Есть два способа настроить Redis для страницы и кеша по умолчанию. Вы можете вручную отредактировать файл <Magento install dir>app/etc/env.php или использовать командную строку, что является рекомендуемым методом, поскольку также обеспечивает проверку.

Для кэша по умолчанию выполните команду:

php bin/magento setup:config:set --cache-backend=redis --cache-backend-redis-<parameter_name>=<parameter_value>...

Укажите параметры, относящиеся к кэшированию Redis по умолчанию.

Для кеша страницы выполните команду:

Php bin/magento setup:config:set --page-cache=redis --page-cache-redis-server=redis.example.com --page-cache-redis-db=1

Эта команда включает кэширование страниц Redis, устанавливает хост на redis.example.com и назначает номер базы данных 1. Вы можете проверить все подробности в Magento DevDocs.

Итоги оптимизации производительности Magento

Мы рассмотрели довольно много подходов к оптимизации производительности Magento 2, так что давайте кратко подведем итоги.

Выявление и устранение узких мест будет иметь огромное значение в обработке ваших данных. Использование полностраничного кеша и Varnish также улучшит скорость вашего сайта и ускорит HTTP-трафик. Вы всегда должны использовать Magento в производственном режиме на своем действующем сервере, никаких оправданий. Используйте минимизацию, чтобы уменьшить размер файлов CSS и JS, файл меньшего размера будет загружаться быстрее и использовать меньше пропускной способности.

Включите плоские таблицы, чтобы уменьшить количество запросов к базе данных и улучшить время отклика базы данных. Оптимизируйте свои изображения и используйте CDN, если это возможно. Настройте индексаторы для обновления по расписанию и включите cron Magento. Включение сжатия gzip также уменьшит размер загружаемых файлов. Использование Elasticsearch повысит скорость страниц вашего каталога, а страница результатов поиска будет загружаться намного быстрее. Используйте Redis для кэша страниц и хранилища сеансов, который значительно быстрее, чем кэш памяти по умолчанию.

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