Ускорение загрузки страниц интернет-магазина

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

Для ускорения интернет-магазина необходимо оптимизировать работу:

  1. сервера;
  2. клиентской (браузерной) части.

Ускорение работы сервера

Основная метрика, показывающая скорость работы сервера – TTFB (time to first byte) – время до получения первого байта веб-страницы от сервера после отправки запроса. Чем быстрее этот показатель, тем эффективнее работает сервер.

Измерение TTFB в Google Chrome

Для ускорения метрики TTFB проводят оптимизацию:

  • Nginx, Apache;
  • операционной системы (как правило, Linux);
  • железо;
  • СУБД;
  • программного кода.

Настройка NGINX

Тюнинг Nginx включает в себя установку оптимальных настроек для работы интернет-магазина. Например, для 1С Битрикс разработчики рекомендует выставлять следующие настройки в конфигурационном файле nginx.

Nginx+PHP-FPM

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

При одинаковом количестве установленных рабочих процессов Nginx будет быстрее Apache, т.к. Nginx работает в качестве прокси-сервера и входящие динамические запросы будет отдавать PHP-FPM, а в это время сам обрабатывать запросы со статикой (отдавать файлы с диска). Nginx работает как конвейер и перекидывает запросы между пользователями и PHP, а также разделяет работу со статикой и динамикой.  Apache же будет для статики и динамики занимать рабочий процесс.

HTTP/2

HTTP/2 – новая версия HTTP 1.1, направленного на ускорение передачи данных.  Протокол является бинарным и разбивает данные на части и транспортирует их между клиентом и сервером. Преимущества протокола:

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

Сжатие Gzip и Brotli

Чтобы уменьшить вес файлов и увеличить скорость передачи данных по сети используют сжатие gzip и brotli.

Сжатие css gzip и brotli

Brotli 10-20% эффективнее сжимает, чем gzip, но работает только с HTTPS. Актуальную версию brotli можно скачать на github.

Операционная система

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

Обновление софта и библиотек

Важно обновлять криптографическую библиотеку OpenSSL, которая используется в HTTPS.

TCP/IP

TCP Congestion Avoidance Algorithm – алгоритм, обеспечивающий наиболее быструю передачу данных между 2-мя узлами и контролирующий нагрузку в сетях TCP.

Когда мы передаем данные у нас существуют ограничения на скорость потоков для того, чтобы не переполнилась сеть пакетами и не произошел коллапс сети – congestion control.

Тюнинг tcp_congestion_control дает прирост пропускной способности сети.

Чтобы ускорить загрузку контента для клиентов с плохими сетями используйте режим BBR.

Чтобы посмотреть настройку tcp_congestion_control на Linux-сервере, выполните команда

По умолчанию — net.ipv4.tcp_congestion_control = cubic

qdisc – сетовой объект по управлению очередями.

Чтобы посмотреть настройку qdisc, введите команду в терминале

По умолчанию — net.core.default_qdisc = pfifo_fast

Чтобы включить BBR (для Ubuntu включать на ядре не ниже 4.9) введите команду:

Обработчик очередей для пакетов, который включает в себя механизмы, с которыми работает BBR поменять на значение «fq»

Лимиты на открытые файлы

В Linux устанавливаются жесткие ограничения на количество открываемых файлов для каждого процесса и пользователя. Лимиты устанавливаются для ограничения использования оперативной памяти. Операционной системе требуется память для управления каждым открытым файлом.

СУБД

Для ускорения СУБД работают над скоростью чтения и записи в нее, оптимизируют SQL-запросы и схему БД (например, вносят дополнительные индексы и колонки).

Железо

Предпочтение отдавать процессорам с меньшим количеством ядер и большей частотой (например, процессорам Intel 8 или 9 серии, AMD Ryzen), выбирать жесткие диски NVMe SSD, и иметь оперативную память от 16 GB.

Ускорение на стороне клиента (браузера)

Для ускорения на стороне клиента оптимизируют:

  • JavaScript код;
  • CSS;
  • картинки;
  • шрифты;
  • видео и звук.

JS и CSS

Оптимизация JS сводится к минификации и объединении кода, сжатии, деления на основной и выполнение которого можно отложить, чистке неиспользуемого кода.

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

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

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

Объяснение работы async для JS

А атрибут defer откладывает выполнение скрипта до тех пор, пока вся страница не будет загружена полностью.Объяснение работы defer для JS

CSS (таблицы стилей) аналогично блокирует рендеринг страниц.

Таблицы стилей – средство оформления сайтов, которые могут достигать больших объемов ввиду использования фреймворков, раздувающих размер кода. Т.к. это текстовые данные, то необходимо передавать в сжатом виде (gzip и brotli).

Таблицы стилей загружаются с высоким приоритетом. В некоторых случаях возможно перенос CSS вниз страницы или производить динамическую подгрузку. Но это нужно делать с умом, т.к. убивается возможность кеширования (т.к. HTML страница динамическая).

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

Использовать preload, prefetch, preconnect. Общая идея этих тегов – сказать браузеру какие ресурсы нам понадобятся и мы должны их заранее получить.

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

Prefetch – загрузить тогда, когда будут ресурсы, на следующем шаге. Т.е. мы понижаем приоритет загрузки на первом шаге загрузки страницы.

Preconnect – создает соединение, не загружая никаких ресурсов. Делаем соединение (например, подключаемся к внешним доменам) на ранней стадии загрузки, а ресурсы приезжают позже. Например, когда нужно как можно быстрее вывести виджет.

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

В некоторых случаях добавление JS и CSS кода прямо в HTML может ускорить загрузку.

Шрифты

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

Для ускорения загрузки шрифтов нужно:

  • выбирать максимально компактные;
  • оптимизировать состав;
  • дать максимальный приоритет тем шрифтам, которые влияют на отрисовку контента на первоначальном этапе загрузки страницы (использовать preload при подключении);
  • использовать font-display – позволяет управлять рендерингом шрифтов и за счет этого ускорять отрисовку страницы. Бывает auto, block, swap, fallback (отрисовка запасных шрифтов, когда не успели придти подключаемые), optional. Подробнее об этом читайте у гугл.
  • смотреть за плагинами, которые тоже приносят шрифты извне.

Актуальный формат, поддерживаемый браузерами – woff2. Использует максимально эффективное сжатие brotli и его не нужно дополнительно ужимать.

Картинки

Для быстрой загрузки страницы следите за размером картинок. Они должны быть оптимизированы: выбран правильный формат, сжат, размеры соответствовать отображаемым в верстке сайта. Изменение размера – изменение в пикселях, сжатие – рекомпрессия jpeg с другими параметрами.

Используйте современные форматы изображений для браузеров:

Применяйте кодеки для сжатия существующих картинок:

Если картинки находятся ниже 1-го экрана, то их обязательно нужно делать lazy-load (ленивая загрузка. Чтобы сделать lazy-load средствами браузера, читайте здесь.

Но также lazy-load делается при помощи JS. Обязательно использовать на сайтах с большим количеством тяжелых картинок, находящихся ниже 1 экрана. С другой стороны, вместо того, чтобы делать ленивую загрузку картинок, лучше повысить приоритет того, что нам нужно в первую очередь и оно будет загружаться быстрее.

Минификация кода

Все файлы, которые содержат текст: js, css, html, svg необходимо оптимизировать – убирать пробелы, отступы, переносы. Все эти элементы раздувают вес и, вследствие чего, увеличивается время обработки пакетов, когда они прилетают в браузер. Следовательно, увеличивается время отображения документа.

Минифицированный HTML-код

Если разбираться глубоко, то становится понятно, что на самом деле при минификации мы экономим не только на весе документа, но и далее ресурсы устройств. Особенно объем передаваемого трафика становится актуальным при передаче в мобильные устройства в мобильной сети: загрузили меньше данных, сэкономили на передаче по сети, в оперативной памяти устройства данные занимают меньше места и их распаковка происходит быстрее, быстрее отрабатывает парсер браузера потому что нет пробелов и отступов. Экономия не только на передачу меньшего веса по сети, но и далее, вплоть до отрисовки страниц.

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

В ситуациях, когда файлов немного воспользуйтесь сервисами:

CSS — https://csscompressor.com/ — с возможностью выставлять разную степень компрессии.

JS, CSS, HTML — http://minifycode.com/ — как проводить компрессию, так и приводить в человоекочитаемый вид.

Svg — https://jakearchibald.github.io/svgomg/

В документе HTML вперемежку вставляют JS, CSS. Чтобы не нарушить их работу делать это нужно аккуратно. Например, для минификации HTML-кода в 1С Битрикс добавляют в init.php  следующий код:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *