Перейти к содержимому

Семь систем, разобранных механизм за механизмом.

Всё, что ниже, уже есть в расширении сегодня. Здесь нет пунктов из планов и нет цифр, которые нечем подкрепить — только что делает каждая часть и как именно.

систем: 7 механизмов: 49 Всё это в одной лицензии

Кэш страниц

Отдаётся до запуска OpenCart.

При попадании ответ уходит прямо из catalog/index.php, раньше фреймворка. Всё, что ниже, определяет, что именно отдаётся, как долго и что происходит, пока страница пересобирается.

Ответ до фреймворка
Закэшированные страницы отдаются из catalog/index.php ещё до запуска OpenCart — ноль запросов к базе при попадании.
Заранее сжатые копии
Для каждой закэшированной страницы на диске лежит готовая копия .gz, поэтому сжатие gzip выполняется один раз, а не на каждый запрос.
ETag и Last-Modified
Закэшированные страницы отдают заголовки ETag и Last-Modified, поэтому на повторный запрос без изменений браузер получает 304, а не страницу заново.
TTL для отдельных маршрутов
Отдельные маршруты могут переопределять срок жизни кэша, и каждый TTL получает разброс по времени, чтобы страницы не истекали все разом.
Soft-bust epoch
Метка soft-bust epoch разом помечает весь кэш устаревшим, не удаляя с диска ни одного файла.
stale-while-revalidate
Истёкшая страница продолжает отдаваться, пока в фоне собирается свежая копия — посетитель никогда не ждёт пересборки.
stale-if-error
Если фоновая пересборка сорвалась, вместо ошибки продолжает отдаваться последняя удачная копия из кэша.
Кэш для авторизованных покупателей
По желанию. Авторизованные посетители читают тот же общий гостевой кэш; корзина и данные аккаунта подставляются на сервере до отправки ответа механизмом Dynamic Fragments — а сама авторизованная сборка страницы никогда не сохраняется. Не рекомендуется магазинам с ценами по группам покупателей — админка об этом предупреждает.
Dynamic Fragments
Персональные участки страницы — прежде всего корзина — заполняются разметкой конкретного посетителя целиком на сервере, до отправки байтов: без JavaScript, без заглушки и без подмены после отрисовки. Это делают три шага, и каждый безопасно пропускает работу при сбое: stash сохраняет живую сборку фрагмента для посетителя после его последнего действия с корзиной; mark находит в общей закэшированной странице элемент по настроенному id-селектору и оборачивает его маркерами; apply в момент отдачи заменяет обёрнутый элемент сохранённой копией посетителя. Совпадение ищется только по id-селекторам, не по классам, и любой шаг, который не нашёл совпадения, просто оставляет гостевую разметку как есть.
Очистка и повторный прогрев по сущности
Изменение товара, категории, информационной страницы или производителя очищает только затронутые страницы и ставит их в очередь на ближайший прогрев.
Наблюдатель на cron
Ловит изменения, сделанные вообще мимо OpenCart — когда прямо в базу пишет ERP или скрипт выгрузки — отслеживая поле date_modified у каждой строки.
Canonical Domain Redirect
По желанию. Отдаёт 301 с ненастроенного двойника домена магазина (www или без него) на настроенный, чтобы дерево кэша было одно, а у поисковиков не появлялось дублей. Карта доменов строится из таблицы магазинов и никогда не правится руками.

Кэш запросов и данных

Одно изменение обесценивает одну таблицу, а не всё сразу.

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

Кэш запросов
Результаты SELECT витрины кэшируются с метками инвалидации по таблицам, поэтому запись в одну таблицу сбрасывает только её закэшированные чтения.
Кэш результатов Journal3
Собственный кэш результатов Journal3 включён наравне с остальным кэшем запросов.
Быстрый файловый кэш
По желанию. Заменяет внутренности штатного драйвера Cache\File в OpenCart: чтение по точному имени и обход папки раз в 30 минут вместо glob по всей папке на каждый запрос.
Лог медленных запросов
Каждый медленный запрос пишется в лог вместе с выжимкой EXPLAIN.
Лог слишком больших выборок
Запросы к базе, которые возвращают слишком большую выборку, пишутся в отдельный лог.

Статические файлы

Меньше данных, и платить за это дважды не нужно.

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

Минификация
Минифицируются HTML, CSS — и во внешних файлах, и внутри страницы — и JS.
Сборка в один файл
Файлы CSS и JS объединяются, чтобы странице требовалось меньше запросов.
Асинхронный и критический CSS
Критический CSS встраивается прямо в страницу, чтобы верхний экран отрисовался сразу, а остальная таблица стилей грузится асинхронно.
Отложенный JS
Скрипты откладываются, чтобы не блокировать отрисовку страницы.
Отложенные сторонние скрипты
Сторонние скрипты грузятся позже, после самой страницы.
Resource hints
В страницу добавляются подсказки, чтобы браузер начал работу над нужными ресурсами раньше, чем запросит их напрямую.
Speculation Rules
Вероятные следующие страницы заранее загружаются и отрисовываются через API Speculation Rules, а для браузеров, которые его ещё не поддерживают, есть запасной вариант по намерению посетителя.
Минификация не тратится на некэшируемые страницы
Экономящая байты минификация выполняется только для ответов, которые сохраняются и отдаются повторно — динамическая, некэшируемая страница не платит за минификацию, которая ей не окупится.

Изображения

Каждое изображение отрабатывает свой вес, не больше.

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

Ленивая загрузка
Изображения грузятся только по мере приближения к области просмотра.
Явные размеры
У изображений проставлены width и height, поэтому браузер резервирует под них место и страница не прыгает при загрузке.
Предзагрузка LCP
Самое большое ожидаемое изображение страницы загружается заранее, чтобы не оно оказалось причиной позднего Largest Contentful Paint.
Создание WebP
Версии в WebP создаются через хуки в собственный ресайзер изображений OpenCart, а не отдельным конвейером.
Быстрый предварительный ресайз
Необычно большие исходные изображения проходят быстрый предварительный ресайз до обычного шага изменения размера в OpenCart.

Защита

Плохой трафик разворачивают раньше, чем он что-то стоит.

Тот же путь до фреймворка, который отдаёт готовую страницу, разворачивает и запросы, которым до OpenCart вообще нет дела.

Файрвол запросов
Шаблоны URL и user-agent проверяются до загрузки фреймворка; заблокированный запрос получает 403 до фреймворка, так же быстро, как попадание в кэш.
Ограничение ботов
Промахи кэша от перечисленных парсеров получают 503 вместо выполнения полного запроса.
Проверка по обратному DNS
Посетитель, который выдаёт себя за крупный краулер, проверяется по обратному DNS — поддельный Googlebot попадает под ограничение, а не под доверие.
Мгновенный 404
По желанию. Запросы к несуществующим статическим файлам получают мгновенный 404 ещё до фреймворка.
Защита сессий от ботов без куки
По желанию. Не даёт ботам, которые не хранят куки, раздувать хранилище сессий.
Блокировка входа в админку
Повторные неудачные попытки входа в админку блокируют учётную запись.

Прогрев

Кэш наполняется сам, не за счёт посетителя.

Краулер, запускаемый по cron, держит кэш наполненным от лица гостя, поэтому настоящий посетитель редко попадает на холодную страницу.

Краулер по cron из CLI
Запускается по cron как гость и обходит магазин, пересобирая его кэш.
Учитывает нагрузку и продолжается с места остановки
Прогрев отступает при высокой нагрузке и продолжается с того места, где остановился, а не начинает заново.
Отталкивается от реального трафика и ссылок на страницах
Что обходить, берётся из реального трафика плюс ссылок, найденных на уже прогретых страницах.
Каждый вариант устройства
Когда включён кэш по типам устройств, прогрев собирает копию для каждого варианта, а не только для одного.

Панель управления

Всё, что делает движок, в одном месте.

В панели управления в админке следят за кэшем, прогревом и файрволом, настраивают их и очищают кэш.

Оценка состояния
Оценка состояния с конкретными рекомендациями, собранная из проверок на ходу: доля обходов кэша, ненастроенные домены и свежесть прогрева по cron.
История попаданий
История доли попаданий в кэш во времени.
Монитор трафика
Трафик магазина в реальном времени.
Медленные запросы
Лог медленных запросов прямо в панели управления.
Очистка отдельных URL
Отдельные URL можно очистить из кэша вручную.
Работа с индексами и таблицами базы
Инструменты для работы с индексами и таблицами базы прямо из панели управления.
Уборка осиротевших и устаревших строк
Осиротевшие и устаревшие строки можно найти и убрать из панели управления.
Экспорт и импорт настроек
Набор настроек можно выгрузить и загрузить обратно.
Просмотр в обход кэша
Строка запроса ?nitro=<token> позволяет посмотреть живую, некэшированную страницу для проверки, пока все остальные посетители получают кэш.

Принципы

Три правила, на которые опирается вся эта страница.

Fail open, везде
Любая внутренняя ошибка приводит к обычному поведению OpenCart — запрос продолжается так, будто Nitro не установлен.
Никогда не кэшировать персональные страницы
Динамические сборки страниц исключены из общего кэша по устройству — нет и пути, по которому они могли бы туда попасть.
Каждый хук ocmod проверяет первым делом
Каждый патч ядра ничего не делает, когда Nitro выключен или отсутствует, поэтому после выключения не остаётся ничего.

Все настройки

Каждый переключатель и что он на самом деле делает.

Nitro поставляется с разумными значениями по умолчанию и профилем, который выставляет их разом. Здесь вся поверхность настроек — на случай, если захотите пойти дальше.

Кэш

Что отдаётся с диска, как долго и кто никогда не получает страницу из кэша.

Состояние
Общий выключатель. Выключен — Nitro не делает ничего, и OpenCart работает как всегда.
Профиль
Выставляет все переключатели ниже разом: Safe, Recommended или Aggressive. Списки и учётные данные не трогает.
Полностраничный кэш
Отдаёт гостям готовый HTML до запуска OpenCart. Авторизованные посетители и корзины всегда получают живую страницу.
Срок жизни кэша
Сколько страница отдаётся до пересборки. Изменение в каталоге всё равно очищает её сразу.
Фоновое обновление после
После этого возраста страница по-прежнему отдаётся мгновенно и обновляется за спиной у посетителя, так что никто не ждёт.
Срок жизни кэша по маршрутам
Отдельный срок для страниц, подходящих под шаблон. Побеждает первое совпадение.
Игнорируемые URL
Любая страница, в адресе которой встречается одно из этих значений, не кэшируется и не отдаётся из кэша.
Игнорируемые параметры URL
Отбрасываются до того, как адрес станет ключом кэша, поэтому ссылки с utm и gclid делят одну закэшированную страницу.
Куки, отключающие кэш
Посетитель с одной из этих куки получает живую страницу — ничего его не кэшируется и не сохраняется.
Отдельный кэш по куки
Не отказ от кэша, а отдельная закэшированная страница — для выбранного магазина или ценовой группы B2B.
Кэш по типу устройства
Десктоп, мобильные и планшеты кэшируются отдельно. Нужно, только если ваша тема отдаёт им разный HTML.
Кэш для авторизованных покупателей
Отдаёт авторизованным покупателям страницы из кэша с их собственной корзиной, подставленной на сервере.
Без кэша для активных посетителей
Тот, у кого уже есть корзина или купон, получает живую страницу, чтобы область корзины была верной в любой теме.
Отдавать устаревшее при ошибке
Если страница упала при сборке, а копия в кэше есть, отдаётся последняя удачная копия.
Максимальный размер кэша
Ограничивает кэш на диске. При превышении прогрев удаляет самые старые файлы. 0 — без ограничения.
Заголовки кэша для браузера
Cache-Control, ETag и Last-Modified на закэшированных страницах, чтобы браузеры и CDN дёшево проверяли актуальность.
Канонические URL товаров
Кэширует товар один раз, а не по разу на каждый путь категории, через который его можно открыть.
No-index для отфильтрованных URL
Держит отфильтрованные и отсортированные списки вне результатов поиска, не запрещая при этом их обход.
Кэш запросов
Кэширует результаты SELECT витрины и обесценивает их по таблицам, поэтому изменение сбрасывает только свою таблицу.
Быстрый файловый кэш
Заменяет собственный файловый кэш OpenCart, который замедляет каждую страницу по мере роста. Те же данные, то же поведение.
Оптимизация запросов
Выверенные и безопасные переписывания известных запросов OpenCart к товарам — ничего наугад.
Индекс цен товаров
Заранее считает акционные и скидочные цены, чтобы страницы списков не высчитывали их для каждого товара.
Оптимизация шаблонов
Собирает страницы более быстрым шаблонизатором и откатывается на стандартный, если что-то необычно.
Почта лицензии
Ваша лицензия покрывает этот адрес и этот домен вместе, поэтому здесь должен быть адрес, с которым вы покупали.

Фронтенд

Что доходит до браузера, в каком порядке и чему позволено задерживать первую отрисовку.

Minify HTML
Убирает пробелы и комментарии из сохранённого документа.
Minify CSS и JS
Только меньше байтов. Порядок загрузки не меняет, поэтому безопасно практически в любой теме.
Сборка файлов CSS
Объединяет локальные таблицы стилей в один файл и правит url(), чтобы шрифты и изображения по-прежнему находились.
Сборка файлов JS
Объединяет локальные скрипты в один, пропуская async, defer и module, чтобы не сломать порядок выполнения.
Исключения из сборки
Файлы, которые остаются вне сборок — библиотеки тем со своим загрузчиком.
Async CSS
Грузит таблицы стилей, не задерживая первую отрисовку, с запасным вариантом через noscript.
Critical CSS
CSS верхнего экрана встроен в начало head, чтобы первая отрисовка не ждала ничего.
Автоматический Critical CSS
Вычисляет эти стили за вас. Это эвристика — проверьте результат, а не полагайтесь на него.
Отложить JavaScript
Добавляет defer внешним скриптам, чтобы они перестали блокировать отрисовку.
Исключения из отложенных
Та самая библиотека, которая ломается при defer, намеренно оставлена блокирующей.
Задержать сторонний JS
Подходящие сторонние скрипты ждут первого действия посетителя, а не грузятся вместе со страницей.
Resource Hints
Строки preconnect, dns-prefetch и preload для хостов и файлов, которые странице действительно нужны.
Предзагрузка при наведении
Забирает следующую страницу, как только посетитель показал намерение, — переход ощущается мгновенным.
Режим предзагрузки
Prefetch скачивает следующую страницу; prerender ещё и собирает её — быстрее, но тяжелее.
Content Visibility
Позволяет браузеру пропускать раскладку и отрисовку разделов, пока их не прокрутят на экран.
Селекторы ниже первого экрана
К каким разделам это применяется, по одному селектору в строке.
CSS Journal3 в файлы
Выносит CSS темы Journal3 из каждой страницы в закэшированные файлы.
Dynamic Fragments
Участки, которые заполняются собственной версией каждого посетителя — корзина и всё подобное ей.
Заполнять личные области на сервере
Заполняет эти участки до отправки страницы, чтобы одна закэшированная страница подходила всем.

Изображения

Работа с изображениями идёт через собственный ресайзер OpenCart, поэтому не расходится с остальной страницей.

Отдавать WebP
Отдаёт WebP там, где копия выходит меньше, ссылаясь на неё напрямую, чтобы старые браузеры получали оригинал.
Качество изображений
Качество кодирования для JPEG и WebP после изменения размера. 80 — точка равновесия.
Быстрое изменение размера
Делает миниатюры очень больших изображений без таймаута — обычной причины сломанной миниатюры.
Размеры изображений
Проставляет width и height там, где их нет, чтобы браузер резервировал место и ничего не прыгало.
Ленивая загрузка изображений
Изображения за экраном грузятся позже; первое остаётся немедленным, чтобы не задерживать самую большую отрисовку.
Определять изображение LCP
Измеряет, какое изображение настоящий браузер отрисовывает самым большим, и в следующий раз загружает заранее именно его.

Защита

Тот же путь до фреймворка, который отдаёт готовую страницу, разворачивает и то, что до OpenCart доходить не должно.

Файрвол запросов
Отказывает известным атакам и сканированиям до загрузки OpenCart, поэтому они почти ничего не стоят.
Заблокированные шаблоны
Распространённые атаки блокируются и так. Это поле — для ваших собственных добавлений вроде /phpmyadmin.
Заблокированные user-agent
Боты, которым отказано сразу. Никогда не вписывайте сюда Google или Bing.
Ограничивать парсеров
Парсеры по-прежнему получают страницы из кэша; они просто перестают заставлять собирать свежие.
Ограничиваемые боты
К каким именам ботов это применяется.
Блокировать сессии ботов
Не даёт ботам заполнять таблицу сессий — именно это разгоняет её до гигабайтов.
Мгновенный 404 для статики
Мгновенно отвечает на запросы к отсутствующим изображениям, CSS и шрифтам вместо сборки страницы ошибки.
Источник IP посетителя
Откуда берётся адрес посетителя — напрямую или от прокси, который стоит перед вами.
Доверять проброшенному HTTPS
Только для магазина за Cloudflare, CDN или балансировщиком, который завершает HTTPS.

Прогрев и диагностика

Как держать кэш наполненным, не заставляя платить за это посетителя, и как увидеть, что тормозит.

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

Посмотрите, сколько это стоит.

Одна лицензия, один домен магазина, навсегда. Без тарифов.

Посмотреть цену