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: кластеризация,
stickysessions. - Интеграция с Битрикс24: принудительное включение WebSocket, тестирование отката на SSE/Long Polling.
- Оптимизация системных лимитов:
ulimit,worker_connections,LimitNOFILE. - Документация по поддержке и мониторингу.
- Обучение администратора (1 час).
Гарантируем стабильную работу: после настройки выдерживаем нагрузку до 10 000 одновременных соединений (подтверждено кейсами). Свяжитесь с нами для бесплатной консультации по вашему проекту. Мы оценим текущую инфраструктуру и предложим оптимальное решение.







