Настройка мультисайтовости 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.ru)
├── Store: Retail
│ ├── Store View: Russian (ru_RU) [default]
│ └── Store View: English (en_US)
└── Store: Wholesale
└── Store View: Russian (ru_RU) [default]
Website: Partner (b2b.myshop.ru)
└── Store: B2B Catalog
└── Store View: Russian (ru_RU) [default]
Создание через Admin
Admin > Stores > All Stores
1. Create Website
- Name: B2B Portal
- Code: b2b (уникальный, только латиница/цифры/underscore)
- 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: Русский
- Code: b2b_ru
- 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_ru";
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 RUB)
Через 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_ru general/locale/code ru_RU
bin/magento config:set --scope=stores --scope-code=b2b_ru general/locale/timezone Europe/Moscow
bin/magento cache:flush
Деплой статики для нескольких тем
При мультисайте разные Website/Store могут использовать разные темы:
# Деплой для всех тем и локалей
bin/magento setup:static-content:deploy ru_RU en_US de_DE \
--theme MyCompany/retail \
--theme MyCompany/b2b \
--jobs=4 \
-f
Общая клиентская база vs изолированная
По умолчанию клиенты общие для всей инсталляции — 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 недели.







