За основу взята статья учебного курса https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=41&LESSON_ID=8609&LESSON_PATH=3911.2033.8609 (настройки redis.conf и nginx у меня не приложены примеры по ссылке)
Под ubuntu установка push сервера выглядит так:
#добавление репозитория node js и установка
sudo -s
LOGS_FILE=$(mktemp /tmp/bitrix-env-XXXXX.log)
curl --silent --location https://deb.nodesource.com/setup_8.x | bash - >>$LOGS_FILE 2>&1
sudo apt install -y nodejs
#добавление репозитория redis и установка
sudo add-apt-repository ppa:chris-lea/redis-server
sudo apt install redis-server
# поменять группу пользователя redis на ту под которой работает php-fpm
usermod -g www-data redis
# в systemd поменять группу под которой работает redis:
mkdir /etc/systemd/system/redis.service
[Service]
Group=www-data
systemctl daemon-reload
# перезапустить redis
service redis restart
# push-service process manager for NodeJS: push-server-multi поместить в /etc/init.d
# /etc/init.d/push-server-multi
#!/bin/bash
#
# push-service process manager for NodeJS
#
# chkconfig: 345 80 20
#
# description: start and stop push process
# processname: push-service
#
### BEGIN INIT INFO
# Provides: push-services
# Required-Start: $local_fs $remote_fs
# Required-Stop: $local_fs $remote_fs
# Should-Start: $network
# Should-Stop: $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: push init script
### END INIT INFO
PROG=$(basename $0)
CONF=/etc/default/push-server
# Source function library.
. /lib/lsb/init-functions
generate_security_key(){
randLength=128
rndStr=</dev/urandom tr -dc A-Za-z0-9 | head -c $randLength
echo $rndStr
}
to_log(){
msg="$1"
[[ -z $msg ]] && return 1
LOGGER_NAME=push-server
LOGGER_LEVEL=daemon.warning
logger -t $LOGGER_NAME -ip $LOGGER_LEVEL "$msg"
echo "$msg"
}
[[ -f $CONF ]] && \
. $CONF
[[ -z $HG_DIR ]] && HG_DIR=/opt/push-server
[[ -z $CFG_DIR ]] && CFG_DIR=/etc/push-server
[[ -z $VAR_DIR ]] && VAR_DIR=/var/log/push-server
[[ -z $BASE_SUB ]] && BASE_SUB=801 # base for port number where sub services lives
[[ -z $BASE_PUB ]] && BASE_PUB=901 # base for port number where pub services lives
[[ -z $TMPL_SUB ]] && TMPL_SUB=push-server-sub-__PORT__.json
[[ -z $TMPL_PUB ]] && TMPL_PUB=push-server-pub-__PORT__.json
[[ -z $USER ]] && USER=bitrix
[[ -z $ID_SUB ]] && ID_SUB=2 # max ID for sub service
[[ -z $ID_PUB ]] && ID_PUB=1 # max ID for pub service
[[ -z $IP_LIST ]] && IP_LIST='"127.0.0.1"'
[[ -z $PID_SUB ]] && PID_SUB=push-server-sub-__PORT__.pid
[[ -z $PID_PUB ]] && PID_PUB=push-server-pub-__PORT__.pid
[[ -z $WS_HOST ]] && WS_HOST=127.0.0.1
[[ -z $WS_PORT ]] && WS_PORT=8895
[[ -z $REDIS_SOCK ]] && REDIS_SOCK=/var/run/redis/redis.sock
[[ -z $SUBPATH ]] && SUBWSPATH="/bitrix/subws/"
[[ -z $SUBWSPATH ]] && SUBPATH="/bitrix/sub/"
[[ -z $PUBPATH ]] && PUBPATH="/bitrix/pub/"
[[ -z $RESTPATH ]] && RESTPATH="/bitrix/rest/"
[[ ! -d $VAR_DIR ]] && mkdir -p $VAR_DIR && chown ${USER}:root $VAR_DIR
# default values
if [[ -z $SECURITY_KEY ]]; then
to_log "generate security key"
SECURITY_KEY=$(generate_security_key)
echo "SECURITY_KEY=$SECURITY_KEY" >> $CONF
fi
# process template
process_template(){
template_name=$1
service_id=$2
service_base=$3
template_file=$CFG_DIR/$template_name
for service_id in `seq 0 ${service_id}`; do
echo -n "Update config service=$service_id -> "
service_port=${service_base}${service_id}
dest_file=$(echo "$template_file" | sed -e "s/__PORT__/$service_port/")
cat $template_file | \
sed -e "s/__PORT__/$service_port/g;
s/__SECURITY_KEY__/$SECURITY_KEY/g;
s/__WS_HOST__/$WS_HOST/g;
s/__WS_PORT__/$WS_PORT/g;
s:__PUBPATH__:$PUBPATH:g;
s:__SUBPATH__:$SUBPATH:g;
s:__RESTPATH__:$RESTPATH:g;
s:__SUBWSPATH__:$SUBWSPATH:g;
s:__REDIS_SOCK__:$REDIS_SOCK:g;
s:__IP_LIST__:$(printf "%q" $IP_LIST):g;
"> $dest_file
chown -R ${USER}:root $dest_file
echo "$dest_file"
done
}
# generate configs for services
generate_config(){
SERVICE=${1:-all}
[[ ( "$SERVICE" == "all" ) || ( "$SERVICE" == "sub" ) ]] && \
process_template "$TMPL_SUB" "$ID_SUB" "$BASE_SUB"
[[ ( "$SERVICE" == "all" ) || ( "$SERVICE" == "pub" ) ]] && \
process_template "$TMPL_PUB" "$ID_PUB" "$BASE_PUB"
}
status_service(){
template_name=$1
service_id=$2
service_base=$3
pid_name=$4
pid_file=$VAR_DIR/$pid_name
service_type=$(echo $template_name | awk -F'-' '{print $3}')
for service_id in `seq 0 ${service_id}`; do
service_port=${service_base}${service_id}
pidf=$(echo "$pid_file" | sed -e "s/__PORT__/$service_port/")
echo -n "Status $service_type-$service_port -> "
status -p $pidf
done
}
status_services(){
SERVICE=${1:-all}
[[ ( "$SERVICE" == "all" ) || ( "$SERVICE" == "sub" ) ]] && \
status_service "$TMPL_SUB" "$ID_SUB" "$BASE_SUB" "$PID_SUB"
[[ ( "$SERVICE" == "all" ) || ( "$SERVICE" == "pub" ) ]] && \
status_service "$TMPL_PUB" "$ID_PUB" "$BASE_PUB" "$PID_PUB"
}
start_service(){
template_name=$1
service_id=$2
service_base=$3
pid_name=$4
template_file=$CFG_DIR/$template_name
pid_file=$VAR_DIR/$pid_name
service_type=$(echo $template_name | awk -F'-' '{print $3}')
for service_id in `seq 0 ${service_id}`; do
log_file=$VAR_DIR/$service_type-$service_port.log
service_port=${service_base}${service_id}
cfgf=$(echo "$template_file" | sed -e "s/__PORT__/$service_port/")
pidf=$(echo "$pid_file" | sed -e "s/__PORT__/$service_port/")
# debug
to_log "pid_file=$pid_file template_file=$template_file service_type=$service_type"
echo -n "Start $service_type-$service_port -> "
status -p $pidf 1>/dev/null 2>&1
status_rtn=$?
if [[ $status_rtn -eq 0 ]]; then
echo "is running pid=$(cat $pidf)"
else
# start process
pushd $HG_DIR 1>/dev/null 2>&1
sudo -u $USER -H /bin/bash \
-c "( node server.js --config $cfgf \
1>$log_file 2>&1 ) &"
rtn=$?
to_log "start rtn_code=$rtn"
if [[ -z $rtn ]]; then
to_log "error on start"
else
pid=$(ps -ef | grep "node server.js --config $cfgf" | \
grep -v grep | awk '{print $2}')
if [[ $pid -gt 0 ]] 2>/dev/null; then
to_log "OK pid=$pid pidf=$pidf"
echo $pid > $pidf
else
to_log "Error"
fi
fi
popd 1>/dev/null 2>&1
fi
done
}
# start services
start_services(){
SERVICE=${1:-all}
[[ ( "$SERVICE" == "all" ) || ( "$SERVICE" == "sub" ) ]] && \
start_service "$TMPL_SUB" "$ID_SUB" "$BASE_SUB" "$PID_SUB"
[[ ( "$SERVICE" == "all" ) || ( "$SERVICE" == "pub" ) ]] && \
start_service "$TMPL_PUB" "$ID_PUB" "$BASE_PUB" "$PID_PUB"
}
stop_service(){
template_name=$1
service_id=$2
service_base=$3
pid_name=$4
template_file=$CFG_DIR/$template_name
pid_file=$VAR_DIR/$pid_name
service_type=$(echo $template_name | awk -F'-' '{print $3}')
for service_id in `seq 0 ${service_id}`; do
service_port=${service_base}${service_id}
pidf=$(echo "$pid_file" | sed -e "s/__PORT__/$service_port/")
echo -n "Stop $service_type-$service_port -> "
killproc -p ${pidf} 1>/dev/null 2>&1
kill_rtn=$?
if [[ $kill_rtn -gt 0 ]]; then
echo "Error"
else
echo "Ok"
fi
done
}
# start services
stop_services(){
SERVICE=${1:-all}
[[ ( "$SERVICE" == "all" ) || ( "$SERVICE" == "sub" ) ]] && \
stop_service "$TMPL_SUB" "$ID_SUB" "$BASE_SUB" "$PID_SUB"
[[ ( "$SERVICE" == "all" ) || ( "$SERVICE" == "pub" ) ]] && \
stop_service "$TMPL_PUB" "$ID_PUB" "$BASE_PUB" "$PID_PUB"
}
case ${1} in
"update_configs") generate_config ${2} ;;
"start") start_services ${2} ;;
"status") status_services ${2} ;;
"stop") stop_services ${2} ;;
"restart")
stop_services ${2}
start_services ${2}
;;
"reset")
generate_config ${2}
stop_services ${2}
start_services ${2}
;;
*)
echo "Usage: {start|stop|update_configs|status|restart|reset} {sub|pub}"
exit 1
;;
esac
# конфиг push-server: push-server поместить в /etc/default/, push-server-pub-__PORT__.json, push-server-sub-__PORT__.json поместить в /etc/push-server/
# /etc/default/push-server
HG_DIR=/opt/push-server
CFG_DIR=/etc/push-server
VAR_DIR=/var/log/push-server
BASE_SUB=801 # base for port number where sub services lives
BASE_PUB=901 # base for port number where pub services lives
TMPL_SUB=push-server-sub-__PORT__.json
TMPL_PUB=push-server-pub-__PORT__.json
USER=bitrix
ID_SUB=5 # max ID for sub service
ID_PUB=1 # max ID for pub service
IP_LIST='"127.0.0.1", "10.0.0.0/24"'
PID_SUB=push-server-sub-__PORT__.pid
PID_PUB=push-server-pub-__PORT__.pid
WS_PORT=1337
PUBPATH=/bitrix/pub/
SUBPATH=/bitrix/sub/
SUBWSPATH=/bitrix/subws/
WS_HOST=127.0.0.1
SECURITY_KEY=
REDIS_SOCK=/var/run/redis/redis.sock
# /etc/push-server/push-server-pub-__PORT__.json
{
"servers": [
{
"name": "pub-__PORT__",
"port": __PORT__,
"hostname": "__WS_HOST__",
"backlog": 1024,
"routes": {
"pub": "__PUBPATH__",
"stat": "/server-stat/",
"rest": "__RESTPATH__"
}
}
],
"publishMode": true,
"processUniqueId": "pub-__PORT__",
"clusterMode": true,
"storage": {
"type": "redis",
"socket": "__REDIS_SOCK__",
"messageTLL": 86400,
"channelTLL": 86400,
"onlineTLL": 120,
"onlineDelta": 10
},
"security": {
"key": "__SECURITY_KEY__"
},
"limits": {
"maxPayload": 1048576,
"maxConnPerChannel": 100,
"maxMessagesPerRequest": 100,
"maxChannelsPerRequest": 100,
"maxRequestsPerSecond": 50
},
"debug": {
"folderName": "/var/log/push-server",
"ip": [__IP_LIST__],
"trustProxy": true
}
}
# /etc/push-server/push-server-sub-__PORT__.json
{
"servers": [
{
"name": "sub-__PORT__",
"port": __PORT__,
"hostname": "__WS_HOST__",
"backlog": 1024,
"routes": {
"sub": "__SUBWSPATH__"
}
}
],
"clusterMode": true,
"processUniqueId": "sub-__PORT__",
"storage": {
"type": "redis",
"socket": "__REDIS_SOCK__",
"messageTLL": 86400,
"channelTLL": 86400,
"onlineTLL": 120,
"onlineDelta": 10
},
"security": {
"key": "__SECURITY_KEY__"
},
"debug": {
"folderName": "/var/log/push-server",
"ip": [__IP_LIST__],
"trustProxy": true
}
}
# Установка Bitrix push-server
sudo -s
# создание пользователя и группы bitrix
getent group bitrix >/dev/null || \
groupadd -g 600 bitrix
getent passwd bitrix >/dev/null || \
useradd -g bitrix -u 600 \
-d /home/bitrix -m -c "Bitrix user" bitrix
exit 0
# распаковка архива
mkdir /opt/push-server
# дистрибутив можно взять из виртуальной машины CentOS в папке /opt/push-server
sudo tar -xzf push-server.tar.gz -C /opt/push-server
sudo chown -R bitrix:bitrix /opt/push-server
chmod 755 `find /opt/push-server -type d`
# добавление пользователя bitrix в группу где состоит пользователь redis
sudo usermod -a -G www-data bitrix
# установка push-server
sudo npm install --production /opt/push-server/ 2>/dev/null
# добавление push-server в сервисы systemd
touch /lib/systemd/system/push-server.service
cat > /lib/systemd/system/push-server.service
[Unit]
Description=RTC service
After=redis.target
[Service]
Type=forking
ExecStart=/etc/init.d/push-server-multi start
ExecStop=/etc/init.d/push-server-multi stop
WorkingDirectory=/opt/push-server
Restart=always
RestartSec=30
PrivateTmp=false
[Install]
WantedBy=multi-user.target
systemctl enable push-server.service
systemctl daemon-reload
mkdir /var/log/push-server
# Создание конфигурационных файлов для запускаемых процессов. Одновременно в конфиге будет создан ключ SECURITY_KEY:
/etc/init.d/push-server-multi reset
# Шаг ниже осуществляется после этапа развертывания сайта
# В конфигурационный файл bitrix/.settings.php добавить настройки вида:
'pull' => Array(
'value' => array(
'path_to_listener' => 'http://#DOMAIN#/bitrix/sub/',
'path_to_listener_secure' => 'https://#DOMAIN#/bitrix/sub/',
'path_to_modern_listener' => 'http://#DOMAIN#/bitrix/sub/',
'path_to_modern_listener_secure' => 'https://#DOMAIN#/bitrix/sub/',
'path_to_mobile_listener' => 'http://#DOMAIN#:8893/bitrix/sub/',
'path_to_mobile_listener_secure' => 'https://#DOMAIN#:8894/bitrix/sub/',
'path_to_websocket' => 'ws://#DOMAIN#/bitrix/subws/',
'path_to_websocket_secure' => 'wss://#DOMAIN#/bitrix/subws/',
'path_to_publish' => 'http://<yourdomain.com>:8895/bitrix/pub/',
'nginx_version' => '3',
'nginx_command_per_hit' => '100',
'nginx' => 'Y',
'nginx_headers' => 'N',
'push' => 'Y',
'websocket' => 'Y',
'signature_key' => '',
'signature_algo' => 'sha1',
'guest' => 'N',
),
),
# В качестве signature_key указать настройки из /etc/default/push-server (SECURITY_KEY)
# Этот же код вписать в поле Код-подпись для взаимодействия с сервером на странице /bitrix/admin/settings.php?lang=ru&mid=pull&mid_menu=1
Установить в админке bitrix использование нового push-server в настройках модуля push&pull |