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.
Після перемикання домену пройдіться за загальним чек-листом зі статті чеклист перевірки сайту після міграції.