Семь систем, разобранных механизм за механизмом.
Всё, что ниже, уже есть в расширении сегодня. Здесь нет пунктов из планов и нет цифр, которые нечем подкрепить — только что делает каждая часть и как именно.
систем: 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 — разумная точка отсчёта.
Посмотрите, сколько это стоит.
Одна лицензия, один домен магазина, навсегда. Без тарифов.