Налаштування мультисайтовості Magento 2 (Website/Store/Store View)
Magento 2 дозволяє керувати кількома сайтами з однієї інсталяції. Це не просто зручність — при правильній архітектурі мультисайт значно зменшує операційне навантаження: одна кодова база, один деплой, спільні товари та клієнтська база з окремими каталогами та налаштуваннями.
Трирівнева ієрархія
Magento ділить сайти на три рівні з чіткою ієрархією:
Website — верхній рівень. Визначає:
- Незалежну корзину та чекаут (покупки не переносяться між Website)
- Спільну клієнтську базу (за замовчуванням) або ізольовану
- Базову валюту
- Групи Store
Store (Store Group) — середній рівень:
- Корінну категорію каталогу (різні дерева категорій для різних Store)
- Кілька Store View для однієї мовної версії
- Один Store View повинен бути помічений як Default
Store View — нижній рівень:
- Мову та локалізацію
- URL (поддомен або шлях)
- Переводи контенту
Типова структура:
Website: Main (myshop.com)
├── Store: Retail
│ ├── Store View: English (en_US) [default]
│ └── Store View: German (de_DE)
└── Store: Wholesale
└── Store View: English (en_US) [default]
Website: Partner (b2b.myshop.com)
└── Store: B2B Catalog
└── Store View: English (en_US) [default]
Створення через Admin
Admin > Stores > All Stores
1. Create Website
- Name: B2B Portal
- Code: b2b (унікальний, тільки латиниця/цифри/підкреслення)
- Sort Order: 2
2. Create Store (Store Group)
- Website: B2B Portal
- Name: B2B Catalog
- Root Category: B2B Categories (створюється окремо)
- Default Store View: (вибирається після створення Store View)
3. Create Store View
- Store: B2B Catalog
- Name: English
- Code: b2b_en
- Status: Enabled
- Sort Order: 1
Конфігурація Nginx для мультисайту
Варіант 1 — різні поддомени:
# /etc/nginx/sites-available/magento-retail.conf
server {
listen 443 ssl http2;
server_name shop.example.com;
root /var/www/magento/pub;
set $MAGE_RUN_CODE "base";
set $MAGE_RUN_TYPE "website";
include /etc/nginx/snippets/magento.conf;
}
# /etc/nginx/sites-available/magento-b2b.conf
server {
listen 443 ssl http2;
server_name b2b.example.com;
root /var/www/magento/pub;
set $MAGE_RUN_CODE "b2b";
set $MAGE_RUN_TYPE "website";
include /etc/nginx/snippets/magento.conf;
}
Варіант 2 — URL-шляхи (один домен):
server {
listen 443 ssl http2;
server_name example.com;
root /var/www/magento/pub;
# Визначення Store View по URL-шляху
location ~ ^/b2b {
set $MAGE_RUN_CODE "b2b_en";
set $MAGE_RUN_TYPE "store";
rewrite ^/b2b/?(.*) /$1 break;
}
location / {
set $MAGE_RUN_CODE "base";
set $MAGE_RUN_TYPE "website";
}
include /etc/nginx/snippets/magento.conf;
}
Варіант 3 — через PHP entry point (найбільш гнучкий):
// pub/index.php — кастомне відображення до Bootstrap::run()
use Magento\Framework\App\Bootstrap;
require __DIR__ . '/../app/bootstrap.php';
$host = $_SERVER['HTTP_HOST'] ?? '';
$params = $_SERVER;
$runCodes = [
'shop.example.com' => ['type' => 'website', 'code' => 'base'],
'b2b.example.com' => ['type' => 'website', 'code' => 'b2b'],
'de.example.com' => ['type' => 'store', 'code' => 'store_de'],
];
if (isset($runCodes[$host])) {
$params['MAGE_RUN_TYPE'] = $runCodes[$host]['type'];
$params['MAGE_RUN_CODE'] = $runCodes[$host]['code'];
}
$bootstrap = Bootstrap::create(BP, $params);
$app = $bootstrap->createApplication(\Magento\Framework\App\Http::class);
$bootstrap->run($app);
Налаштування URL для Store View
Admin > Stores > Configuration > Scope: [Store View]
> General > Web > Base URLs
Base URL: https://b2b.example.com/
Base Link URL: https://b2b.example.com/
Base Static View Files URL: https://b2b.example.com/pub/static/
Base Media Files URL: https://b2b.example.com/pub/media/
Для HTTPS:
> Base URLs (Secure)
Secure Base URL: https://b2b.example.com/
Use Secure URLs on Storefront: Yes
Use Secure URLs in Admin: Yes
Окремі каталоги
Кожний Store має свою Root Category. Це дозволяє показувати різні дерева категорій:
Admin > Catalog > Categories
Створити корінну категорію "B2B Categories":
├── Промислове обладнання
│ ├── Станки
│ └── Вимірювальні прилади
└── Розходні матеріали
Створити корінну категорію "Retail Categories":
├── Електроніка
├── Побутова техніка
└── Інструменти
Товари можуть бути спільними — один товар прив'язаний до категорій з різних дерев.
Scope конфігурації
Більшість налаштувань Magento мають Scope: Global → Website → Store View. Налаштування Store View перекривають Website, які перекривають Global.
Admin > Stores > Configuration
Поточний scope: вибирається у верхньому лівому кутку
Приклад — різні методи доставки для різних Website:
Scope: Website B2B
> Sales > Shipping Methods
Table Rates: Enabled
Free Shipping: Disabled (для B2B показуємо реальну вартість)
Scope: Website Retail
> Sales > Shipping Methods
Table Rates: Enabled
Free Shipping: Enabled (від 3000 USD)
Через CLI з указанням scope:
# Встановлення базового URL для конкретного Website
bin/magento config:set --scope=websites --scope-code=b2b web/unsecure/base_url https://b2b.example.com/
bin/magento config:set --scope=websites --scope-code=b2b web/secure/base_url https://b2b.example.com/
# Для Store View
bin/magento config:set --scope=stores --scope-code=b2b_en general/locale/code en_US
bin/magento config:set --scope=stores --scope-code=b2b_en general/locale/timezone UTC
bin/magento cache:flush
Деплой статики для кількох тем
При мультисайті різні Website/Store можуть використовувати різні теми:
# Деплой для всіх тем та локалей
bin/magento setup:static-content:deploy en_US de_DE \
--theme MyCompany/retail \
--theme MyCompany/b2b \
--jobs=4 \
-f
Спільна клієнтська база проти ізольованої
За замовчуванням клієнти спільні для всієї інсталяції — email унікальний глобально. Для ізоляції клієнтів по Website:
Admin > Stores > Configuration > Scope: Global
> Customers > Customer Configuration > Account Sharing Options
Share Customer Accounts: Per Website
Після зміни — обов'язковий bin/magento customer:hash:upgrade та переіндексація.
Продуктивність мультисайту
Кожна Store View додає навантаження на індексатори та кеш. При великій кількості Store View:
- Індексер
catalog_product_price— найбільш важкий, потребує оптимізації - Varnish FPC розділяє кеш по Store View через
X-Magento-Tags - Redis кеш повинен мати окремі бази для різних типів даних
Моніторинг повільних індексаторів:
bin/magento indexer:status
bin/magento indexer:reindex catalog_product_price
# Час останньої переіндексації
SELECT indexer_id, status, updated FROM indexer_state;
Термін виконання
Додавання другого Website/Store зі спільним каталогом та окремими налаштуваннями: 2–3 дні. Повнофункціональний мультисайт з 3–5 Website, різними темами, ізольованими каталогами, окремою клієнтською базою та кастомними Nginx-правилами: 1–2 тижні. Якщо додати B2B-модуль Adobe Commerce з корпоративними акаунтами та прайс-листами: додатково 2–4 тижні.







