Настройка NodeJS для push-уведомлений Битрикс
Long Polling через PHP держит по одному PHP-процессу (или FPM worker) на каждое открытое соединение. При 500 одновременных пользователях — 500 занятых воркеров, которые просто ждут событий и не делают ничего полезного. PHP-FPM под такой нагрузкой упирается в лимиты пула. NodeJS решает эту проблему: один Node-процесс обрабатывает тысячи соединений через event loop без блокировки.
Архитектура: NodeJS как Push-сервер
NodeJS push-сервер от Битрикс — это готовый пакет push-server, который входит в состав Bitrix VM или устанавливается отдельно. Он принимает события от PHP через HTTP API, хранит очередь в Redis и доставляет клиентам через WebSocket или SSE.
PHP → HTTP POST → NodeJS push-server ← WebSocket/SSE → браузеры
↕
Redis
Установка NodeJS push-server
На Bitrix VM push-server уже установлен. На чистом сервере:
# Установка NodeJS LTS
curl -fsSL https://rpm.nodesource.com/setup_20.x | bash -
yum install -y nodejs
# Или для Ubuntu
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt install -y nodejs
# Скачать push-server из репозитория Битрикс
# (пакет доступен подписчикам BitrixEnv или в составе Bitrix VM)
# Обычно располагается по пути:
ls /opt/push-server/
Типовая структура:
/opt/push-server/
app.js — точка входа
config.json — конфигурация
node_modules/ — зависимости
Конфигурация push-server
Файл /opt/push-server/config.json:
{
"server": {
"http": {
"port": 9010,
"host": "127.0.0.1"
},
"websocket": {
"port": 9011,
"host": "0.0.0.0"
}
},
"security": {
"key": "your_secret_key_here",
"cors": ["https://example.ru", "https://www.example.ru"]
},
"redis": {
"host": "127.0.0.1",
"port": 6379,
"database": 1
},
"log": {
"level": "warn",
"file": "/var/log/push-server/app.log"
},
"cluster": {
"workers": 2
}
}
Порт 9010 — HTTP API для PHP (localhost only). Порт 9011 — WebSocket для браузеров (публичный, через Nginx прокси).
Systemd unit для push-server
cat > /etc/systemd/system/push-server.service << 'EOF'
[Unit]
Description=Bitrix Push Server
After=network.target redis.service
[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/push-server
ExecStart=/usr/bin/node app.js --config config.json
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable push-server
systemctl start push-server
Nginx прокси для WebSocket
Браузеры не должны подключаться к NodeJS напрямую — нужен Nginx как прокси с SSL-терминацией:
# В блоке server для HTTPS
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 "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 86400; # 24 часа для WebSocket
proxy_send_timeout 86400;
}
location /bitrix/pub/ {
proxy_pass http://127.0.0.1:9010;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 25;
}
Настройка в Битрикс
В административной панели — «Настройки» → «Push and Pull» → вкладка «Сервер»:
- Push-сервер:
http://127.0.0.1:9010 - Pull-сервер (публичный):
https://example.ru/bitrix/pub/ - WebSocket-сервер (публичный):
wss://example.ru/bitrix/subws/ - Ключ безопасности: тот же, что в
config.json
Или через PHP-код:
\Bitrix\Main\Config\Option::set('pull', 'PUSH_SERVER_URL', 'http://127.0.0.1:9010');
\Bitrix\Main\Config\Option::set('pull', 'PULL_SERVER_URL', 'https://example.ru/bitrix/pub/');
\Bitrix\Main\Config\Option::set('pull', 'SERVER_ENABLED', 'Y');
\Bitrix\Main\Config\Option::set('pull', 'PUSH_SECURITY_KEY', 'your_secret_key_here');
Проверка соединения
# HTTP API доступен
curl -s http://127.0.0.1:9010/server/ping
# Ответ: {"result":"pong"}
# WebSocket через wscat
npm install -g wscat
wscat -c wss://example.ru/bitrix/subws/
# Логи push-server
journalctl -u push-server -f
Мониторинг активных соединений
# Количество WebSocket-соединений
curl -s http://127.0.0.1:9010/server/stat | python3 -m json.tool
# Ответ содержит: connections_count, channels_count, memory_usage
Если connections_count растёт без остановки и не снижается — утечка соединений. Проверить логи на ошибки отключения клиентов.







