Настройка горизонтального масштабирования 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Настройка горизонтального масштабирования 1С-Битрикс
Простая
~1 рабочий день
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1173
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    745
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Настройка горизонтального масштабирования 1С-Битрикс

Горизонтальное масштабирование — добавление узлов вместо увеличения ресурсов одного сервера. Для 1С-Битрикс это означает запуск нескольких веб-серверов за балансировщиком нагрузки при общей базе данных и общем файловом хранилище. Лицензионно это легально только для редакций «Малый бизнес» и выше; «Старт» и «Стандарт» не поддерживают кластер.

Типичный триггер: пиковая нагрузка (распродажи, рекламные кампании), при которой один сервер уходит в своп или упирается в CPU, а простой горизонтальный scale-out не работает из-за несогласованного состояния между узлами.

Что нужно решить для горизонтального масштабирования

Три ключевые проблемы:

  1. Сессии — PHP-сессии по умолчанию хранятся на диске. Если запросы одного пользователя балансируются на разные серверы, сессия теряется.
  2. Файлы — загруженные пользователями файлы, генерируемые кешем файлы должны быть доступны всем узлам.
  3. Кеш Битрикс — управляемый кеш (/bitrix/cache/) хранится на диске. При сбросе кеша на одном узле остальные продолжают отдавать устаревшие данные.

Схема инфраструктуры

Internet
  → Load Balancer (nginx / HAProxy / облачный LB)
      ├─ Web Node 1 (nginx + php-fpm)
      ├─ Web Node 2 (nginx + php-fpm)
      └─ Web Node N (nginx + php-fpm)
           ↓ общие ресурсы
      ├─ MySQL Master (запись) + MySQL Slave (чтение)
      ├─ Redis Cluster (сессии + кеш Битрикс)
      └─ NFS / GlusterFS / S3 (общий файловый том)

Сессии в Redis

Битрикс поддерживает хранение сессий в Memcached и Redis нативно. Настройка в /bitrix/.settings.php:

return [
    'session' => [
        'value' => [
            'mode'     => 'default',
            'handlers' => [
                'general' => [
                    'type'    => 'redis',
                    'host'    => '127.0.0.1', // или Redis Sentinel/Cluster адрес
                    'port'    => 6379,
                    'serializer' => \Redis::SERIALIZER_PHP,
                ],
            ],
        ],
    ],
];

Для Redis Sentinel (высокая доступность):

'general' => [
    'type'      => 'redis',
    'sentinels' => [
        ['host' => 'sentinel-1', 'port' => 26379],
        ['host' => 'sentinel-2', 'port' => 26379],
        ['host' => 'sentinel-3', 'port' => 26379],
    ],
    'master_name' => 'mymaster',
],

Кеш Битрикс в Redis

Переносим управляемый кеш из файловой системы в Redis:

// /bitrix/.settings.php — секция cache
'cache' => [
    'value' => [
        'type'  => 'redis',
        'redis' => [
            'host' => '127.0.0.1',
            'port' => 6379,
            'serializer' => \Redis::SERIALIZER_IGBINARY, // быстрее PHP serializer
        ],
    ],
],

igbinary требует установленного PHP-расширения igbinary. Даёт сжатие данных ~40% по сравнению с PHP serialize и быстрее на десериализации.

Для кеша HTML-страниц (составной кеш, bitrix:page.polycore) Redis менее эффективен — там объекты большие. Лучше оставить на NFS или использовать nginx proxy_cache на уровне балансировщика.

Общий файловый том

Директории, которые должны быть общими:

  • /upload/ — все загруженные пользователями файлы
  • /bitrix/cache/ — если кеш файловый (не Redis)
  • /bitrix/managed_cache/ — то же
  • /bitrix/html_pages/ — HTML-кеш страниц

NFS — самый простой вариант. На выделенном сервере или NAS:

# На NFS-сервере
echo "/srv/bitrix-shared 10.0.0.0/24(rw,sync,no_root_squash,no_subtree_check)" >> /etc/exports
exportfs -ra

# На каждом веб-узле
mount -t nfs nfs-server:/srv/bitrix-shared /var/www/bitrix/upload

Запись в /etc/fstab:

nfs-server:/srv/bitrix-shared /var/www/bitrix/upload nfs rw,sync,hard,intr,timeo=30 0 0

GlusterFS — для production: реплицируется между узлами, нет единой точки отказа:

gluster volume create bitrix-shared replica 2 \
    node1:/data/gluster node2:/data/gluster
gluster volume start bitrix-shared

S3-совместимое хранилище — для облачных сред. Битрикс поддерживает S3 для хранения файлов через модуль Bitrix\Main\File\Remote\S3. Настройка в /bitrix/.settings.php секция file_storage.

MySQL: репликация чтения

При нескольких веб-узлах нагрузка на БД кратно возрастает. Настраиваем read replica:

// /bitrix/.settings.php — секция connections
'connections' => [
    'value' => [
        'default' => [
            'className' => '\\Bitrix\\Main\\DB\\MysqlConnection',
            'host'      => 'mysql-master',
            'database'  => 'bitrix',
            'login'     => 'bitrix',
            'password'  => 'secret',
        ],
        'slave' => [
            'className' => '\\Bitrix\\Main\\DB\\MysqlConnection',
            'host'      => 'mysql-slave',
            'database'  => 'bitrix',
            'login'     => 'bitrix_ro',
            'password'  => 'secret_ro',
        ],
    ],
],

Направляем SELECT-запросы на slave через кастомный Connection Resolver или используем ProxySQL для прозрачного роутинга на уровне драйвера.

Балансировщик нагрузки: nginx upstream

upstream bitrix_backend {
    least_conn;  # балансировка по наименьшему количеству активных соединений

    server web-node-1:80 weight=1 max_fails=3 fail_timeout=30s;
    server web-node-2:80 weight=1 max_fails=3 fail_timeout=30s;
    server web-node-3:80 weight=1 max_fails=3 fail_timeout=30s;

    keepalive 32;
}

server {
    listen 443 ssl;
    server_name example.com;

    location / {
        proxy_pass         http://bitrix_backend;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto https;
        proxy_connect_timeout 5s;
        proxy_read_timeout    60s;
    }
}

Sticky sessions: нужны ли?

При правильно настроенных сессиях в Redis sticky sessions не нужны. Любой узел обслуживает любой запрос. Исключение — загрузка файлов через uploader.php Битрикс: если файл загружается частями (чанками), все части должны попасть на один узел. Решение — sticky session для PUT/POST-запросов на /upload/ или использование отдельного upload-эндпоинта.

Состав работ

  • Аудит текущей архитектуры, план перехода без даунтайма
  • Настройка Redis: сессии + кеш Битрикс
  • Настройка NFS/GlusterFS для общего хранилища файлов
  • Конфигурация nginx upstream и health-checks
  • MySQL Master-Slave + ProxySQL или native Битрикс slave connection
  • Синхронизация codebase между узлами (rsync/git/Ansible)
  • Тестирование при отключении одного из узлов

Сроки: базовый кластер из 2 узлов с Redis и NFS — 2–3 недели. Продакшн-готовая схема с GlusterFS, HA-Redis и мониторингом — 4–6 недель.