Ускорить интернет-магазин сантехники на CS-Cart с каталогом ~58 000 товаров перед запуском рекламы. Страницы категорий открывались 5–16 секунд, главная — 2.7 секунды, поиск — 9–11 секунд. Владелец считал, что упирается в слабый сервер, и думал про апгрейд тарифа.
Я начал не с покупки ресурсов, а с диагностики. На сервере хватало мощности (8 ядер, ~11 ГиБ RAM) — значит, дело не в железе, а в том, что каждый запрос делал лишнюю работу.
Корневой причиной оказался один флаг. В базе был включён режим разработки Smarty (compile_check), оставшийся с чьей-то отладки шаблонов. В ядре CS-Cart он отключает весь блочный кеш — каждая страница пересобиралась с нуля, с десятками тяжёлых SQL-запросов вместо одного. Один UPDATE в базе стал главным фиксом.
Дальше — шесть изменений первой фазы: включение блочного кеша, перенос индексов MyISAM в RAM (key_buffer_size 16M→512M), новые индексы на таблице товаров, блокировка ботов на уровне nginx и скрипт прогрева кеша по витринам.
Отдельно разобрал плавающие тормоза «то быстро, то медленно». Причиной были боты (SemrushBot, ClaudeBot, скрейперы): они грели холодные страницы и упирались в table-lock MyISAM — тёплые категории у живых людей ждали очереди. После блокировки паразитов (поисковые системы оставил) тормоза ушли.
Сознательно отклонил APCu как backend кеша: под Apache mpm_itk каждый запрос — отдельный процесс, память APCu не разделяется между запросами, замер показал file=940ms против apcu=1360ms. Выбрал по числам, а не по моде.
TTFB на прогретом кеше: главная 2709→819 ms, категории 5–16s→~1s, карточка товара 2018→819 ms, корзина 1374→789 ms. Сервер держит ~100–150 одновременных пользователей / ~15–20k визитов в день — запас под старт рекламы. Без апгрейда тарифа и без переписывания кода.
Честно про ограничения: поиск остаётся ~3.6–4.9s (упирается в движок, нужен FULLTEXT или Searchanise), холодный кеш 3–5s и table-lock MyISAM лечатся миграцией на InnoDB — это дорожная карта под рост трафика, а не latency-тюнинг.