Налаштування веб-сокетів для 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.







