Linux系统安装IM相关服务

1、安装MongoDB

MongoDB是一中非关系型数据库(NoSql)。
    易扩展: NoSQL有很多种,有一个共同特点就是去掉关系数据库的关系特性,数据之间无关系,易于扩展。
    高性能: 在大数据量下,有很优秀的读写性能,因为数据库的结构简单。
    灵活性:无须事先建立字段、表。如果数据量非常大,字段非常多,建表很苦难。
    高可用: 在不太影响性能的情况,可以方便的实现高可用的架构。

MongoDB三元素:
    1 数据库: 和关系型数据库中数据库的层次相同,内部可以有多个集合。
    2 集合: 相当于关系型数据库中的表,存储若干文档,结构不固定
    3 文档: 相当于关系型数据库中的行,是Json扩展的Bson类型键值对数据

这个下载太慢,因此先下载了再上传

链接:https://pan.baidu.com/s/1dK8M6LPX6phS0pmd1pw8Xg  密码:zksw

 

上传 mongoDb安装包:

cd /opt
tar -zxvf tar -zxvf mongodb-linux-x86_64-4.0.13.tgz
mv  mongodb-linux-x86_64-3.4.0  mongodb

 

在/opt/mongodb目录下创建mongo.conf文件内容如下:

cd   mongodb
vim  mongo.conf

 

配置模板:

systemLog:

   destination: file
   path: "/opt/mongodb/logs/mongodb.log"
   logAppend: true

storage:
   dbPath: "/data/mongodb"
   journal:
      enabled: true
   mmapv1:
     smallFiles: true
   wiredTiger:
      engineConfig:
        configString: cache_size=1G

processManagement:
      fork: true

net:
   #bindIp: 127.0.0.1
   port: 28018

setParameter:
   enableLocalhostAuthBypass: false

 

#注 加上下面的配置权限验证,需要的可以加,灰常坑
security:
   authorization: enabled

 

然后创建mongodb数据目录,和日志目录

mkdir  -p  /data/mongodb
mkdir  logs

 

在/opt/mongodb目录下创建start启动脚本

vim start

内容如下:

 /opt/mongodb/bin/mongod --config=/opt/mongodb/mongo.conf

 

执行start脚本,出现如下图所示内容则启动成功

 

 

创建stop脚本:

vim stop

内容如下

ps -ef|grep mongo.conf|grep -v grep|awk '{printf $2}'|xargs kill -9

 

*设置用户名密码,这里只建议参考不建议使用

特别注意:mongodb和spring-mongodb默认的认证机制不同,会导致项目中mongo连接不上!

1、mongodb的认证机制有2种:SCRAM-SHA-1和MONGODB-CR。3.0之后版本默认为:SCRAM-SHA-1;

2、spring-mongodb默认为:MONGODB-CR,并不支持设置认证方式;

登录

普通登录:bin/mongo 127.0.0.1:28018

认证登录: bin/mongo -u admin -p 123 --authenticationDatabase admin

查看当前认证机制。为5则需要修改成3,但是改成3新版本的monggo认证模式无法启动。

use admin

db.system.version.findOne({"_id":"authSchema"});
db.system.users.remove({});#删除用户

#先删除再插入
db.system.version.remove({});
db.system.version.insert({"_id":"authSchema","currentVersion":3});

#直接修改
db.system.version.update({"_id":"authSchema"},{$set:{"currentVersion":3}});

 

 用户是和库绑定的,每一个库都需要增加用户且验证

use admin
db.createUser({ user: "root", pwd: "zaixiu!@#$%^", roles:[{role:"userAdminAnyDatabase",db: "admin"}]});
db.auth("root","zaixiu!@#$%^");

use addressbook
db.createUser({user:"root",pwd:"zaixiu!@#$%^",roles:[{role:"read", db:"addressbook"},{role:"readWrite", db:"addressbook"},{role:"dbAdmin",db:"addressbook"}]});
db.auth("root","zaixiu!@#$%^");

 

启动正常springboot也无法正常连接。因此测试环境不再深究取消认证模式,采用数据备份。

创建mongodb备份脚本 

vim mongodb_bak

内容如下

#!/bin/bash
#backup MongoDB

#mongodump命令路径
DUMP=/data/mongodb/bak/mongodump

#临时备份目录
OUT_DIR=/data/mongodb_bak/mongodb_bak_now

#备份存放路径
TAR_DIR=/data/mongodb_bak/mongodb_bak_list

#获取当前系统时间
DATE=`date +%Y_%m_%d`

#数据库账号
DB_USER=root

#数据库密码
DB_PASS=123456

#DAYS=15代表删除15天前的备份,即只保留近15天的备份
DAYS=15

#最终保存的数据库备份文件
TAR_BAK="mongodb_bak_$DATE.tar.gz"


cd $OUT_DIR
rm -rf $OUT_DIR/*

mkdir -p $OUT_DIR/$DATE

#备份全部数据库
$DUMP -h 127.0.0.1:28018 -u $DB_USER -p $DB_PASS --authenticationDatabase "admin" -o $OUT_DIR/$DATE

#压缩为.tar.gz格式
tar -zcvf $TAR_DIR/$TAR_BAK $OUT_DIR/$DATE

#删除15天前的备份文件
find $TAR_DIR/ -mtime +$DAYS -delete

exit

 

授权,使其可执行

chmod +x mongodb_bak

 

修改/etc/crontab,添加计划任务

vi /etc/crontab

 

编辑 /etc/crontab 文件只有 root 用户才行
查看当前用户是否为root

whoami

 

检测系统是否安装crond服务和运行状态,如果是运行状态可跳过下面带 * 的步骤

service crond status

 

*安装命令,一般系统都有

#vixie-cron 软件包是 cron 的主程序;
#crontabs 软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序。
yum -y install vixie-cron
yum -y install crontabs

 

*启动服务

service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置
service crond status //查看crontab服务状态

 

*设置开机自动启动

chkconfig --level 345 crond on

 

每天晚上23:50开始执行MongoDB数据库备份脚本,考虑数据量和备份时间取50

#分 时 日 月 周  命令
50 23 * * * root /opt/mongodb/mongodb_bak

 

附录:MongoDB数据库恢复,注意linux系统使用绝对路径,否则 -bash: mongorestore: command not found

#恢复全部数据库
/mongodbpath/mongorestore -u $DB_USER -p $DB_PASS --authenticationDatabase "admin" --noIndexRestore --dir /data/mongodb_bak/mongodb_bak_now/2016_12_17/
#恢复单个数据库
/mongodbpath/mongorestore -u $DB_USER -p $DB_PASS --authenticationDatabase "admin" --noIndexRestore -d dbname --dir /data/mongodb_bak/mongodb_bak_now/2016_12_17/dbname

实例1 先删库再恢复
/mongodbpath/bin/mongorestore -h 127.0.0.1:27017 --drop /data/mongodb_bak/mongodb_bak_now/2021_10_27
实例2 恢复
/mongodbpath/bin/mongorestore -h 127.0.0.1:27017 /data/mongodb_bak/mongodb_bak_now/2021_10_27

更多请参考MongoDB的备份与恢复

 

 

测试服允许远程访问放通对应端口,生产环境不能放通

netstat  -tunlp

 

28018端口没有开放,查看防火墙状态。

firewall-cmd --state  #查看防火墙状态。

 

得到结果是running或者not running, 如果没开启

systemctl start firewalld

 

在running 状态下,向firewall 添加需要开放的端口

firewall-cmd --permanent --zone=public --add-port=28018/tcp  #永久的添加该端口。去掉--permanent则表示临时。

 

与之对应关闭的命令为

firewall-cmd --zone=public --remove-port=28018/tcp --permanent

 

加载配置,使得修改有效。

firewall-cmd --reload 

 

 

2、安装Redis

下载、解压、安装,参考https://redis.io/download

wget https://download.redis.io/releases/redis-6.2.6.tar.gz
tar xzf redis-6.2.6.tar.gz
cd redis-6.2.6
make

 

修改redis目录下redis.conf文件中配置项:

daemonize yes(进程后台运行)

#允许远程访问,注意这个是测试环境才允许
注释掉 #bind 127.0.0.1

将protected-mode no #改为no关闭保护模式,外网可以直接访问

requirepass 123456 #设置密码

 

在redis目录下创建start启动脚本内容如下:

/opt/redis-6.2.6/src/redis-server  /opt/redis-6.2.6/redis.conf

 

执行sh start 命令启动脚本,查看redis是否启动成功

 

 

 

 同上创建stop脚本用于关闭redis

ps -ef|grep  /opt/redis-6.2.6/src/redis-server|grep -v grep|awk '{printf $2}'|xargs kill -9
ps -ef|grep  /opt/redis-6.2.6/src/redis-server

 

测试环境6379对外开放

查看6379端口,安全组也要放通6379端口

netstat –tunlp

 

6379端口没有开放,查看防火墙状态。

firewall-cmd --state  #查看防火墙状态。

 

在running 状态下,向firewall 添加需要开放的端口

firewall-cmd --permanent --zone=public --add-port=6379/tcp  #永久的添加该端口。去掉--permanent则表示临时。

 

加载配置,使得修改有效。

firewall-cmd --reload 

 

外部连接redis,测试成功

 

 

 

 

3、安装Jdk1.8+

安装java环境,直接命令:

yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel

 

配置环境变量

vim /etc/profile

 

i (进入编辑状态),将下面行代码放在文件末尾

JAVA_HOME=/usr/lib/jvm//usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el7_9.x86_64
JRE_HOME=/usr/lib/jvm//usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el7_9.x86_64/jre
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$JAVA_HOME/bin:$PATH
export PATH JAVA_HOME CLASSPATH

 

按Esc(退出编辑状态)

:wq(保存并退出)

 

 让设置立即生效

source /etc/profile

 

 查看JDK 是否安装成功

java -version

 

 

 

4、安装RocketMQ 队列

下载地址:建议使用最新版,低版本有fastjson低版本jar包的漏洞

https://www.apache.org/dyn/closer.cgi?path=rocketmq/4.9.1/rocketmq-all-4.9.1-bin-release.zip

 

上传,安装

cd  /opt
unzip rocketmq-all-4.9.1-bin-release.zip
mv rocketmq-all-4.9.1-bin-release rocketmq

根据内存的大小调整rocketmq的内存,默认的大了些

vim  bin/runbroker.sh

 

JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn125m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
 JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=256m"

 

vim bin/runserver.sh

 

 

创建脚本启动

vim mqStart

 

写入如下内容:

#!/bin/sh
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el7_9.x86_64
nohup sh /opt/rocketmq /bin/mqnamesrv > /opt/rocketmq /logs/rocketmqlogs/namesrv.log  2>&1 &
echo "Start Name Server End"
nohup sh /opt/rocketmq /bin/mqbroker -n localhost:9876 > /opt/rocketmq /logs/rocketmqlogs/broker.log  2>&1  &
echo "Start  Broker End"

 

创建脚本停止

vim mqStop

写入内容

#!/bin/sh
sh /opt/rocketmq/bin/mqshutdown broker &
sh /opt/rocketmq/bin/mqshutdown namesrv
echo "Please wait process to exit! check it type jps"

 

执行jps 命令 查看正常应该能看到NamesrvStaup 和 BrokerStartup

jps

 

注册推送消息、用户状态话题

sh  bin/mqadmin updateTopic -n localhost:9876  -c DefaultCluster  -t  pushMessage
sh  bin/mqadmin updateTopic -n localhost:9876  -c DefaultCluster  -t  xmppMessage
sh  bin/mqadmin updateTopic -n localhost:9876  -c DefaultCluster  -t  userStatusMessage
sh  bin/mqadmin updateTopic -n localhost:9876  -c DefaultCluster  -t  HWPushMessage
sh  bin/mqadmin updateTopic -n localhost:9876  -c DefaultCluster  -t  fullPushMessage
sh  bin/mqadmin updateTopic -n localhost:9876  -c DefaultCluster  -t  keywordMessage

 

 

 

*查看所有消费组group(进入bin目录下)

 sh mqadmin consumerProgress -n 127.0.0.1:9876

* 查看指定消费组下的所有topic数据堆积情况:

    sh mqadmin consumerProgress -n 127.0.0.1:9876 -g groupname

* 查看所有topic :

  sh mqadmin topicList -n 127.0.0.1:9876

* 查看topic信息列表详情统计

   sh mqadmin topicstatus -n 127.0.0.1:9876 -t topicWarning

*  新增topic

   sh mqadmin updateTopic –n 127.0.0.1:9876 –c DefaultCluster –t topicWarning

* 删除topic

  sh mqadmin deleteTopic –n 127.0.0.1:9876 –c DefaultCluster –t topicWarning

*查询集群消息

sh mqadmin  clusterList -n 127.0.0.1:9876

 

5、安装Spring-boot-imapi  api 接口服务

这里才有复制的安装包上传到服务器再解压

cd  /opt
unzip spring-boot-imapi.zip
cd  spring-boot-imapi

 

修改application.properties配置文件

vim  application.properties

 

在spring-boot-imapi目录下执行sh start命令运行imapi接口服务

 

 

 

 

启动完成后,在浏览器打开链接“http://localhost:8092/console/login”,出现如下图所示内容即酷聊接口部署成功:

 

将系统配置---> 客户端配置里的地址修改为部署的服务器的地址,这些地址用于在客户端启动时返回给客户端使用,请参考下图

 

 

 

 

6、安装IMServer   Mp-Server 通讯服务

同上,复制压缩包,解压即可。

 

7、安装 shiku-push 推送服务

shiku-push服务为离线消息推送服务,去消费tigase 放到RocketMq 队列里的离线消息。

shiku-push 部署包各个文件说明

这里采用复制压缩包上传的方式安装

unzip shiku-push.zip
cd  shiku-push

 

修改application.properties 配置文件

vim  application.properties

目前ios 支持anps和极光推送 ,安卓目前集成了华为、小米、魅族、vovo、oppo,谷歌六种推送,如果手机有谷歌框架且能访问外网,会使用谷歌推送,否则根据机型来,非以上机型使用小米推送

如已经申请好相关配置,将申请好的小米、华为、极光 等平台的key   secret 配置到对应的位置。也可以后续在配置,加上配置重启shiku-push 服务即可

ios  apns 推送配置。替换ios   apns推送证书,个人版和企业版选择一个使用即可,需要注意在申请ios  apns 证书的时候必须要设置密码

修改完配置后使用 sh start 命令启动shiku-push服务

 

8、安装message-push服务

说明: Message-push 是从 imapi 中独立出来的服务,用于发送系统Xmpp 消息。

Imapi 服务里面群组等部分接口操作后,需要发一条xmpp 消息通知用户,

此时imapi 将需要发送的xmpp 消息放到rocketMq 队列下,由Message-push 服务获取队列里的消息然后把消息经过tigage-server 发送到设备端

 

这里下载地址无法下载,采用复制压缩包的方式

 

unzip message-push.zip
cd  message-push

 

参照如下示例,修改配置文件

vim  application.properties

 

启动 message-push 服务

sh start

 

9、安装Upload文件上传服务

这里下载地址无法下载,采用复制压缩包的方式

unzip upload.zip

 

参照如下示例修改配置:说明:/data/www/resources:文件上传成功后存储的根目录

beginIndex:根目录“/data/www/resources”的字符串长度(从0开始)用于分隔字符串生成文件链接用(需要注意,如果修改了相关路径,beginIndex 的数值也要相应修改)

 

 

 

在文件上传服务所在机器创建存储目录(例如“/data/www/resources”)并初始化目录结构

可以直接将以下命令全部拷贝到Linux服务器一次性执行

mkdir  -p  /data/www/resources
cd /data/www/resources
mkdir audio
mkdir avatar
mkdir avatar/o
mkdir avatar/t
mkdir avatar_r
mkdir avatar_r/o
mkdir avatar_r/t
mkdir gift
mkdir image
mkdir image/o
mkdir image/t
mkdir other
mkdir preview
mkdir temp
mkdir u
mkdir video

 

 启动 upload

cd  /opt/upload
sh  start

 

10、安装Nginx,配置文件访问

首先安装 nginx 所需的依赖 

yum install -y  pcre  pcre-devel  zlib  zlib-devel openssl  openssl-devel  

 

安装 Nginx-1.21.3

直接下载.tar.gz安装包,地址:https://nginx.org/en/download.html

tar  -zxvf  nginx-1.21.3.tar.gz
mv  nginx-1.21.3  nginx-install

cd nginx-install
./configure --prefix=/opt/nginx-1.21.3   --with-http_ssl_module  --with-stream

make && make install
rm  -rf  ../nginx-install

 

在nginx目录下创建start、stop脚本:

start脚本:

 vim  start

 

写入如下内容

./sbin/nginx
ps -ef|grep nginx

 

stop脚本: 

vim  stop

 

写入如下内容

 

./sbin/nginx -s stop
ps -ef|grep nginx

 

2)在upload 所在的机器上 配置头像访问

说明:由于FastDfs 不支持对上传文件的自定义命名,而目前用户头像是根据userId 命名的,所以目前用户头像没有使用FastDfs 储存。

修改Nginx 配置文件 nginx.conf ,添加如下内容(域名配置示例

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  65;
    client_max_body_size 1000M;
    #gzip  on;

    server {
        listen       80;
        server_name  aaa.com;#你的域名
        rewrite ^(.*)$  https://$host$1 permanent;

        location / {
            root   html;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }

    server{
        listen            443 ssl;
        server_name       ts-test.tnshow.com;  #后台接口域名
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 SSLv2;
        ssl_prefer_server_ciphers on;
        ssl_certificate       /ott/nginx-1.21.3/ssl/aaa.com.pem;
        ssl_certificate_key  /ott/nginx-1.21.3/ssl/aaa.com.key;
        ssl_session_timeout 30m;


               location / {
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_pass          http://127.0.0.1:8099; #接口端口

        }

        location /ms {
                  proxy_set_header X-Real-IP $remote_addr;
                  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                  proxy_pass          http://127.0.0.1:8098; #接口端口

        }

        location /public {
                  proxy_set_header X-Real-IP $remote_addr;
                  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                  proxy_pass          http://127.0.0.1:8097; #接口端口

        }

     }

    

     #加载其他配置
    include /ott/nginx-1.21.3/conf/vhosts/*.conf;
 
}

 

执行start、stop脚本,查看nginx是否启动、停止成功:

如按IP方式配置即得到文件访问、下载路径 为 ip:8089

至此服务端相关服务已经部署完成

如出现nginx无法访问的情况,需要安全组、防火墙开通相应的端口,例如80、443等。

最后修改后台配置

Imapi服务启动完成后,在浏览器打开链接“http://localhost:8092/console/login”

将系统配置---> 客户端配置里的地址修改为部署的服务器的地址,这些地址用于在客户端启动时返回给客户端使用,请参考下图

 

修改配置保存后访问

http://localhost:8092/config

 

最后

http://localhost:8092/config 为客户端配置的apiurl  将 apiurl和 apikey(在imapi服务配置文件中配置) 提供 给客户端,客户端打包需要的,至此大功告成。

 

11.安装腾讯云主机安全客户端

wget http://u.yd.tencentyun.com/ydeyes_linux64.tar.gz -O ydeyes_linux64.tar.gz && tar -zxvf ydeyes_linux64.tar.gz && ./self_cloud_install_linux64.sh

检测是否安装成功, 查看 YDService,YDLive进程是否有运行,有运行则安装成功。

ps -ef | grep YD

 

IM各服务启动顺序

1.mongoDB

2.redis 

3.roketmq 

4.imapi 

5.IMserver

6.mp-server

7.shiku-push 

8.message-push 

9.nginx-1.9.11 

10.upload 

 

常见问题排除

1.socket连接不上

检查jks证书和密码是否正确

检查nginx代理配置IM模块是否加载正确

检查端口是否是IPV6类型,当IPV4和6同时存在会超时

netstat –ant

 

禁用IPV6

vim /etc/sysctl.conf

 

写入 

net.ipv6.conf.all.disable_ipv6 = 1

net.ipv6.conf.default.disable_ipv6 = 1

net.ipv6.conf.lo.disable_ipv6 = 1

 

加载让其生效

sudo sysctl -p /etc/sysctl.conf

 

查看状态:

cat /proc/sys/net/ipv6/conf/all/disable_ipv6

显示1说明生效

 

vim  /etc/modprobe.conf

在文档中加入如下的两条:

alias net-pf-10 off
alias ipv6 off

保存退出,并且重新启动系统

重启系统,运行lsmod|grep ipv6,看不到结果说明ipv6已经关闭。此时APP也可以正常发消息了。

如出现PC端能上传图片,而app端不能,则需要关闭防火墙

systemctl  stop  firewalld

 

 

 

posted @ 2021-10-20 18:04  别动我的猫  阅读(1370)  评论(8编辑  收藏  举报