Налаштування Node.js для push-сповіщень Bitrix
Long Polling через PHP тримає по одному PHP-процесу (або FPM worker) на кожне відкрите з'єднання. При 500 одночасних користувачів — 500 занятих воркерів, які просто чекають подій і не роблять нічого корисного. PHP-FPM під такою навантаженням упирається в ліміти пула. Node.js розв'язує цю проблему: один Node-процес обробляє тисячі з'єднань через event loop без блокування.
Архітектура: Node.js як Push-сервер
Node.js push-сервер від Bitrix — це готовий пакет push-server, який входить у склад Bitrix VM або встановлюється окремо. Він приймає события від PHP через HTTP API, зберігає чергу в Redis та доставляє клієнтам через WebSocket або SSE.
PHP → HTTP POST → Node.js push-server ← WebSocket/SSE → браузери
↕
Redis
Установка Node.js push-server
На Bitrix VM push-server уже встановлений. На чистому сервері:
# Установка Node.js 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 з репозиторію Bitrix
# (пакет доступний підписникам 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
Браузери не повинні підключатися до Node.js безпосередньо — потрібен 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;
}
Налаштування у Bitrix
У адміністративній панелі — «Налаштування» → «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 росте без зупинки та не знижується — витік з'єднань. Перевірте журнали на помилки відключення клієнтів.







