Налаштування веб-сокетів для 1С-Бітрікс

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

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

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • 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
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Налаштування веб-сокетів для 1С-Bitrix

WebSocket — протокол постійного двостороннього з'єднання між браузером та сервером. Без WebSocket чат у Bitrix працює через Long Polling: браузер кожні 20 секунд запитує «є нові повідомлення?». З WebSocket сервер відправляє повідомлення миттєво, як тільки воно з'явилось. Для корпоративного порталу, онлайн-чату та сповіщень реального часу — принципова різниця.

Як Bitrix використовує WebSocket

Модуль pull (Push and Pull) при наявності NodeJS push-сервера автоматично переключається з Long Polling на WebSocket. Клієнтська частина — JS-бібліотека BX.PullClient, яка пробує WebSocket першим, при неудачі откатується на SSE, потім на Long Polling.

Транспорт визначається в 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
});

Nginx: правильна конфігурація WebSocket-прокси

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.

Ліміти з'єднань

Кожне WebSocket-з'єднання — це відкритий файловий дескриптор на рівні ОС. При 2000 онлайн-користувачів — 2000 дескрипторів лише від WebSocket.

Системні ліміти:

# Поточний ліміт
ulimit -n

# Збільшити для поточної сесії
ulimit -n 65535

# Постійно через /etc/security/limits.conf
cat >> /etc/security/limits.conf << 'EOF'
www-data soft nofile 65535
www-data hard nofile 65535
nginx   soft nofile 65535
nginx   hard nofile 65535
EOF

# Для systemd-сервісів
# У /etc/systemd/system/nginx.service.d/override.conf:
[Service]
LimitNOFILE=65535

Nginx worker_connections:

events {
    worker_connections 10240;
    use epoll;         # Linux — найефективніший метод
    multi_accept on;   # приймати кілька з'єднань за один виклик
}

Node.js push-server: кластерний режим

Один Node.js-процес використовує одне ядро 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;
}

Відладка WebSocket-з'єднання

У 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

Типові проблеми

З'єднання розривається кожні 60 секунд. proxy_read_timeout у Nginx не встановлений або дорівнює замовчуванню (60s). WebSocket keepalive не встигає.

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.