Magento 2 — самая требовательная к ресурсам платформа среди популярных движков интернет-магазинов. Перенос усложняют три вещи: строгие требования к версиям PHP и Elasticsearch, файл app/etc/env.php с привязкой к путям сервера и обязательная переиндексация каталога после переноса.
Требования Magento 2 к новому серверу
Перед переносом сверьте версии компонентов — несовпадение хотя бы одной ломает установку:
| Компонент | Magento 2.4.6 | Magento 2.4.7 |
|---|---|---|
| PHP | 8.1–8.2 | 8.2–8.3 |
| MySQL | 8.0 | 8.0 |
| Elasticsearch / OpenSearch | 7.17 | 7.17 / 2.12 |
| Redis | 6–7 | 6–7 |
Если версия PHP на новом сервере выше поддерживаемой, composer install завершится ошибкой зависимостей ещё до запуска сайта.
Перенос файлов и медиатеки
Каталог pub/media с изображениями товаров часто весит больше, чем сам код Magento, поэтому переносите его отдельным запуском rsync с флагом докачки, чтобы прерванная передача не начиналась заново:
rsync -avz --partial --progress /var/www/magento/pub/media/ user@newserver:/var/www/magento/pub/media/
Общие приёмы работы с rsync, SCP и FTP разобраны в статье перенос файлов сайта. Каталоги var/cache, var/page_cache и generated переносить не нужно — Magento создаст их заново.
Экспорт и импорт базы данных
База Magento обычно большая из-за таблиц логов и котировок корзин, поэтому перед экспортом очистите старые логи командой bin/magento setup:cleanup:logs, а затем сделайте дамп:
mysqldump -u magento_user -p --single-transaction magento_db | gzip > magento_backup.sql.gz
На новом сервере распакуйте и импортируйте дамп:
gunzip magento_backup.sql.gz
mysql -u magento_user -p magento_db < magento_backup.sql
Общий алгоритм переноса MySQL, включая большие базы, есть в статье перенос базы данных MySQL.
Настройка env.php и cron
Файл app/etc/env.php хранит не только параметры подключения к базе, но и абсолютные пути кеша, сессий и очередей. После переноса обновите блок db и проверьте секцию cache — если пути на диске отличаются, Magento не найдёт файловый кеш и выдаст ошибку 500 на первой же странице.
bin/magento setup:upgrade
bin/magento cache:flush
Magento зависит от cron-задач для очередей сообщений и обновления цен по расписанию, поэтому добавьте задание в crontab пользователя веб-сервера:
* * * * * /usr/bin/php /var/www/magento/bin/magento cron:run 2>&1 | grep -v "Ran jobs by schedule"
Переиндексация каталога после переноса
После импорта базы индексы Magento считаются устаревшими, даже если данные не менялись. Переведите индексацию в режим по расписанию и запустите полную переиндексацию вручную:
bin/magento indexer:set-mode schedule
bin/magento indexer:reindex
Без этого шага каталог покажет неверные цены, остатки товаров и результаты поиска. Переиндексация каталога с 50 000 товаров занимает от 10 до 30 минут в зависимости от мощности сервера.
Проверка перед переключением DNS
Откройте магазин на новом сервере по IP с подменой хоста в локальном файле /etc/hosts и проверьте оформление заказа, применение купона и загрузку изображений из pub/media. Снизьте TTL A-записи домена до 300 секунд за сутки до переключения — так изменения быстрее распространятся у провайдеров DNS. Подробная схема переключения без простоя — в статье смена хостинга без простоя.
Чек-лист миграции Magento 2
- Версии PHP, MySQL и Elasticsearch совпадают с требованиями релиза.
- Каталог pub/media перенесён полностью, var и generated пересозданы.
- env.php обновлён: подключение к базе и пути кеша верны.
- Задание cron:run добавлено в crontab на новом сервере.
- Полная переиндексация каталога выполнена без ошибок.
- Оформление заказа проверено на новом сервере по IP.
После переключения домена пройдитесь по общему чек-листу из статьи чеклист проверки сайта после миграции.