WebSocket для 1С-Битрикс: настройка и снижение задержек

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Услуги, которые мы предлагаем
Показано 1 из 1Все 1626 услуг
WebSocket для 1С-Битрикс: настройка и снижение задержек
Простой
~1 день
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1330
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    924
  • 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
    672
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    815
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    714
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    1051

WebSocket для 1С-Битрикс: настройка и снижение задержек

Представьте: в корпоративном портале 500 сотрудников, чат — основной канал связи. Каждые 20 секунд браузер каждого сотрудника отправляет запрос «есть новые сообщения?» — это Long Polling. Сервер захлебывается, а сообщения приходят с задержкой. Мы сталкивались с этим десятки раз. Настройка WebSocket в Битрикс решает проблему кардинально: сервер сам отправляет данные при появлении, нагрузка на канал падает на 70%, задержка — миллисекунды. С нашим опытом (10+ лет с Битрикс, более 50 проектов с WebSocket) вы получаете гарантию стабильной работы.

Как WebSocket ускоряет работу Битрикс24?

WebSocket — это постоянное двустороннее соединение между браузером и сервером. В Битрикс за него отвечает модуль pull (Push and Pull). При наличии NodeJS push-сердера он автоматически переключается с Long Polling на WebSocket. Клиентская часть — JS-библиотека BX.PullClient, которая пробует WebSocket первым, при неудаче откатывается на SSE, затем на Long Polling.

WebSocket лучше Long Polling в 20 раз по задержке и снижает нагрузку на сервер до 70%.

Транспорт определяется в bitrix/js/pull/pull.js через переменную BX.Pull.config. Принудительно установить транспорт для отладки:

BX.Pull.connect({
    serverEnabled: true,
    serverUrl: 'https://example.ru/bitrix/subws/',
    guestMode: false,
    userId: USER_ID,
    userHash: USER_HASH,
    transport: 'websocket' // принудительно WebSocket
});

Сравним Long Polling и WebSocket:

Характеристика Long Polling WebSocket
Задержка доставки 20 секунд (макс) Миллисекунды
Трафик на клиента Высокий (частые запросы) Низкий (одно соединение)
Нагрузка на сервер Высокая (масса HTTP-запросов) Низкая (до 70% меньше)
Масштабирование Сложно (лимит соединений) Кластеризация (до 10000+)

Почему стандартный Long Polling не подходит для высоконагруженных проектов?

При 2000 онлайн-пользователей Long Polling генерирует 2000 запросов каждые 20 секунд — 100 запросов в секунду. Это создаёт огромную нагрузку на Nginx и PHP-FPM. WebSocket держит одно постоянное соединение на пользователя, что снижает количество HTTP-запросов до нуля. Экономия ресурсов позволяет обслуживать больше клиентов на том же железе. Снижение нагрузки на сервер позволяет экономить на аренде мощностей — в одном из проектов мы сократили затраты на сервер на 40%.

Настройка WebSocket в Битрикс: пошагово

Проверка окружения

Убедитесь, что сервер соответствует требованиям: PHP 7.4+, Node.js 12+, включён модуль proc_open (для работы NodeJS push-server). Наш опыт показывает, что 80% проблем связаны с отсутствием прав на выполнение NodeJS-процесса.

Конфигурация Nginx

WebSocket требует специальной обработки в Nginx. Ключевое — заголовки Upgrade и Connection:

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

server {
    listen 443 ssl http2;
    server_name example.ru;

    # ... SSL настройки ...

    # WebSocket endpoint для push-server
    location /bitrix/subws/ {
        proxy_pass http://127.0.0.1:9011;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # Критически важно: без этого Nginx разрывает соединение через 60 сек
        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;

        # Не буферизировать — данные должны идти в реальном времени
        proxy_buffering off;
    }
}

map $http_upgrade $connection_upgrade — корректная обработка как WebSocket (Upgrade: websocket), так и обычных HTTP-запросов через один location.

Кластеризация NodeJS push-server

Один NodeJS-процесс использует одно ядро CPU. При высокой нагрузке (1000+ соединений) нужен кластерный режим — несколько worker-процессов за load balancer:

В config.json push-server:

{
  "cluster": {
    "workers": 4,
    "sticky": true
  }
}

sticky: true — «липкие» соединения: один клиент всегда попадает на один worker. Без этого WebSocket-соединение может разорваться при переключении между воркерами.

Для балансировки нескольких NodeJS-инстансов в Nginx:

upstream push_backend {
    ip_hash; # sticky sessions по IP
    server 127.0.0.1:9011;
    server 127.0.0.1:9012;
    server 127.0.0.1:9013;
    server 127.0.0.1:9014;
}

location /bitrix/subws/ {
    proxy_pass http://push_backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_read_timeout 3600s;
    proxy_buffering off;
}

Отладка и диагностика

В Chrome DevTools → Network → фильтр WS — показывает все WebSocket-соединения с данными фреймов.

Через curl (только handshake):

curl -v \
  -H "Upgrade: websocket" \
  -H "Connection: Upgrade" \
  -H "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==" \
  -H "Sec-WebSocket-Version: 13" \
  https://example.ru/bitrix/subws/
# Ожидаемый ответ: HTTP/1.1 101 Switching Protocols

Подробнее о протоколе — в Wikipedia.

Дополнительные методы отладки
  • Логи NodeJS push-server: смотреть вывод systemctl status push-server или journalctl -u push-server.
  • Проверить, что порт 9011 открыт: netstat -tlnp | grep 9011.
  • Если используется SSL, убедиться, что Nginx передаёт правильный заголовок X-Forwarded-Proto.

Типовые ошибки и их решение

Рассмотрим несколько частых проблем при настройке WebSocket. Первая — соединение разрывается каждые 60 секунд. Причина: proxy_read_timeout в Nginx не выставлен или равен умолчанию (60s). Решение — увеличить таймаут до 3600s. Вторая — WebSocket не работает за Cloudflare. Cloudflare проксирует WebSocket только на платных тарифах (Pro+). На бесплатном тарифе — использовать long polling или выводить WebSocket-домен из-под Cloudflare (DNS-only). Третья — ошибка 400 Bad Request при handshake. Nginx не передаёт заголовок Upgrade бэкенду — проверить наличие proxy_http_version 1.1 и proxy_set_header Upgrade. HTTP/2 не поддерживает WebSocket upgrade — для WebSocket endpoint использовать только HTTP/1.1.

Что входит в настройку WebSocket?

  • Аудит текущей конфигурации сервера и Битрикс (проверка модуля pull, версии PHP, NodeJS).
  • Настройка Nginx: WebSocket-прокси, SSL, лимиты соединений.
  • Установка и конфигурация NodeJS push-server: кластеризация, sticky sessions.
  • Интеграция с Битрикс24: принудительное включение WebSocket, тестирование отката на SSE/Long Polling.
  • Оптимизация системных лимитов: ulimit, worker_connections, LimitNOFILE.
  • Документация по поддержке и мониторингу.
  • Обучение администратора (1 час).

Гарантируем стабильную работу: после настройки выдерживаем нагрузку до 10 000 одновременных соединений (подтверждено кейсами). Свяжитесь с нами для бесплатной консультации по вашему проекту. Мы оценим текущую инфраструктуру и предложим оптимальное решение.