DevOps · Laravel · Docker

Доска объявлений: развёртывание в Docker и ускорение с 15 секунд до 5

Развернули коммерческий скрипт на Laravel в изолированном Docker-стеке, локализовали под русский, отребрендили и разобрались, почему страница открывалась пятнадцать секунд.

РольРазвёртывание и настройка
СтекLaravel 12 · PHP 8.2
СУБДMariaDB 11 · Redis
Результат15 с → от 5 до 6 с
Задача

Три проблемы в одном проекте

Купленный скрипт доски объявлений нужно было поднять локально, но так, чтобы он не подрался с другими стеками на той же машине (порты СУБД, Redis и админки уже были заняты), заговорил по-русски и открывался за разумное время. На старте главная страница грузилась от 13 до 15 секунд.

Диагностика

Виновата была не база

Первое подозрение падало на запросы к базе. Замерили: от 75 до 88 запросов складываются примерно в 0.1 секунды, медленных нет ни одного. База чиста, сеть ни при чём. Значит, время уходит до того, как код вообще начал работать.

Настоящая причина кроется в медленном пробросе файлов с Windows в контейнер. PHP при настройках по умолчанию проверяет дату изменения каждого файла проекта на каждый запрос. В обычной файловой системе это незаметно; через мост Docker-for-Windows это превращается в тысячи медленных обращений на один заход. Усугубляло то, что лимит кэша скомпилированных файлов стоял на 10 000 при 21 359 PHP-файлах в проекте: кэш переполнялся и перекомпилировал одно и то же по кругу.

Было
15 с
Стало
5 с
Лёгкие страницы
~4 с
Главная страница, локальный стенд, замеры после правок дали от 5 до 6 секунд. Ключевая правка состоит в отключении проверки дат файлов и подъёме лимита кэша выше реального числа файлов проекта.
Решение

Что сделано

Изолированный Docker-стек

Своё имя проекта, своя сеть, свои тома и порты. Стек не конфликтует с уже работающими на машине. В комплекте PHP-FPM, Nginx, MariaDB, Redis и перехватчик почты, чтобы письма не улетали наружу с тестового стенда.

Установка через консоль, а не через мастер

Браузерный мастер установки спотыкался о CSRF, сессии и внешние вызовы. Прошли его детерминированно консольными командами: миграции, наполнение справочников, страна и 2 658 городов, супер-админ, файл-маркер установки. Повторяемо и без сюрпризов.

Русский по умолчанию

Язык переключён в базе, в конфиге и у админа. Отдельно выключено автоопределение по браузеру, иначе английский заголовок от браузера перебивал бы русский дефолт. Здесь же грабли: дефолтный язык кэшируется, без сброса кэша правка не видна.

Ребрендинг ровно по видимой части

Заменили то, что видит пользователь: название, футер, служебные страницы. Функциональный идентификатор скрипта не трогали намеренно: по нему код сравнивает версии, переименование сломало бы логику. Проверено: упоминаний исходного бренда на публичных страницах не осталось.

Кэш и сессии в Redis

Переключение выявило ловушку: конфиг сессий по умолчанию уходил на СУБД и валил приложение пятисоткой. Лечится явным указанием соединения, из тех вещей, которые стоят полчаса, если знаешь, и полдня, если нет.

Результат

Что получилось

×3ускорение главной страницы
2 658городов в справочнике
0конфликтов с другими стеками
18языков доступно, русский по умолчанию

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

Стек

Технологии

Laravel 12PHP 8.2PHP-FPM NginxMariaDB 11Redis Docker Composeopcacheartisan Mailpit
Название площадки, домен и доступы не публикуются по просьбе клиента. Замеры приведены с локального стенда, на боевом сервере без монтирования с Windows цифры будут лучше.