Магазин корпоративных подарков на OpenCart: 89 839 товаров, четыре парсера ходят к поставщикам по расписанию, всё это живёт на общем виртуальном хостинге. Своего разработчика в компании нет, и восемь лет каждая проблема решалась доплатой хостеру: кончалось место, докупали место; росла нагрузка, докупали процессор. В марте пришло письмо о недопустимой нагрузке и угроза отключить аккаунт.
OpenCart · PHP · MySQL · Виртуальный хостинг Hostland · Cloudflare DNS · cron · YML-фид Яндекса
Стек
5 месяцев, волнами
Срок
Диагностика, доработка, поддержка
Роль
Работающий магазин на OpenCart, восемь лет истории, без своего разработчика
На входе
Причины, когда я до них добрался, оказались скучными. Парсеры запускались десять и четырнадцать раз в час и каждый раз перемалывали базу. На страницах товаров сыпался Fatal error из левой колонки каталога. Кэш картинок рос с запуска сайта и не чистился никогда, а рядом с ним лежали два полных дампа базы, доступных по HTTP кому угодно.
Гео-фильтр отсекает запрос по стране ещё до того, как проснётся PHP, кэш отдаёт готовый HTML прямо из файла, и до базы доходит меньшая часть запросов. Нижняя строка схемы про то, о чём вспоминают, когда хостер присылает счёт: парсеры пишут на диск логи, магазин складывает туда же превью картинок, и ни одна куча не чистилась. Теперь у каждой есть срок жизни и задача в расписании.
Что было сложного
Почти все ограничения этой истории от того, что хостинг общий: нет модулей Apache, нет управления PageSpeed, cron живёт по правилам чужой панели. Готовые плагины кэша для OpenCart лезут в шаблон и модификации, а там уже лежало несколько слоёв чужих правок, поэтому полностраничный кэш пришлось написать свой: первый заход кладёт готовый HTML в файл, следующие три часа страница отдаётся из него, минуя PHP и базу. Три часа выбраны под расписание парсеров, чтобы цены и остатки не отставали от каталога больше чем на полсмены. Ключевое здесь не сам кэш, а список исключений из него: корзина, оформление и админка не кэшируются вовсе, и ошибка в этом списке стоит дороже, чем отсутствие кэша. С ботами вышло похоже: Cloudflare в России работает только как DNS, гео-модуля на общем хостинге нет, свой скрипт проверки страны оказался лишним кодом на горячем пути, и в итоге всё уехало в штатную фильтрацию хостера, а чёрный список стран пришлось перевернуть в белый.
/01
- Общий хостинг
- Свой кэш страниц
- Фильтр по странам
- Список исключений
Результат
134 ГБ
Занято на диске
было 188 ГБ · −54 ГБ
0
Товаров, недоступных роботу Яндекса
было 10 · −10
0
Дампов базы в открытом доступе
было 2 · −2
Место мерил по панели хостинга, товары по отчёту Яндекс.Вебмастера, теми же инструментами, что и точки отсчёта. Дополнительные 40 ГБ квоты заказчик отключила, счёт за хостинг вернулся к 2 919 ₽ в месяц. Фид Яндекс принял без замечаний 12 июня; до этого магазина в товарном блоке поиска не было вовсе.
Скорость осталась без цифры. Ускорение было самой большой частью работы: кэширование средствами хостинга эффекта не дало, свой кэш дал, и писем о недопустимой нагрузке за оставшиеся пять месяцев не пришло ни одного. Но в тот же день заказчик докупила процессорные ядра, время ответа я смотрел на глаз, и разделить вклад не могу. Написать «стало быстрее» без числа значит нарушить то, ради чего этот сайт сделан; поставить цифру задним числом значит нарушить это вдвойне.


