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 为客户端配置的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