服务的启动与关闭和日志
野火IM服务启动方式有3种:命令行启动、service启动和docker启动。本文讲解启动方式、停止方式、日志和升级这几方面的内容。
1. Linux服务优化
检查Linux服务器的配置,确认open files
在10万以上或者更大。否则当业务量增大后会出现服务不可用问题(Too many open files
问题)。可以按照 https://gitee.com/wfchat/C1000K_Test 这个项目的说明来优化linux系统。检查命令为ulimit -a
,如下图open files
配置为100万(1024000):
2. windows格式和unix格式
Windows系统和Unix系系统(Linux和Mac)的文件格式是不同的。如果脚本或者配置文件或者授权文件与对应的服务器格式不匹配,就会出现问题。常见的问题是在linux服务器上部署,但脚本和配置文件用windows系统的编辑器编辑,并保存为windows格式,请参考服务常见问题中的问题3。
还有一种常见的问题是IM服务要在Windows系统中运行,这时需要把授权文件改成windows格式。
3. 日志
IM服务启动后,日志会有2种,一种是是控制台日志,一种是IM输出的日志。控制台日志会输出系统的一些日志,还有一些异常信息。IM服务日志在logs目录下,这个目录中会有3个文件,分别是wildfirechat.log
、wildfirechat_warn.log
和wildfirechat_error.log
,分别是info、warn和error日志。wildfirechat.log
日志文件可能为空,这是因为log4j2的配置为异步写,等日志攒够一定量后一次写入,在调试问题是,可以改成同步写,这样能够尽快看到日志。
在每种启动方式下,这2个日志都在不同的地方,后面会在每种启动方式中说明。
4. 升级
如果是集群部署,每次升级时都需要集群全部停机再升级,不能集群节点逐个升级。如果是集群扩容,需要使用相同的版本来启动新节点。当拿到新的软件版本后,旧软件包内的wildfirechat.conf
、c3p0.xml
和启动脚本wildfirechat.sh
是可以复用的,减少了重新配置的工作量,其他文件或者目录一定要用最新的。集群部署时,还有个要修改的配置文件是hazelcast.xml
,这个文件如果新版本有变动时继续使用旧版本,将会引起不可预料的问题,所以建议这个文件新配置,或者比对一下有没有变化。
另外一个老生常谈的问题就是备份,需要备份好旧的软件版本和数据库,方便有问题能够顺利回滚。
5. 验证
IM服务启动成功后,会监听80端口和1883端口,可以用下面2个命令来验证
curl -v http://127.0.0.1/api/version
应该返回一个json文件。
telnet 127.0.0.1 1883
可以看到能够连上1883端口。
如果有web客户端,用下面这个命令检查一下是否开启8083的websocket端口,如果没有就忽略这个检查:
curl -v http://127.0.0.1:8083
如果看到not a WebSocket handshake request: missing upgrade
的提示说明websocket端口已经正确打开了。
在任何服务启动后,都需要用这几个命令验证一下IM服务是否正确启动。
上面提到的端口都是野火默认的端口,如果使用了其他端口,验证时也请对应修改。
6. 命令行启动
在野火IM压缩包解压后的bin
目录下,有2个脚本文件,分别是wildfirechat.sh
和stop.sh
,对应野火IM服务启动和停止脚本。在终端窗口进入到bin
目录下,执行命令:
nohup ./wildfirechat.sh 2>&1 &
既可启动专业版IM服务。在非root用户权限下启动有可能会失败,因为IM服务监听80端口,需要root权限。可以使用sudo nohup ./wildfirechat.sh 2>&1 &
命令。也可以设置Java的capabilities授予Java监听80的权限(后面有说明如何设置)。
windows系统下,打开命令行窗口,进入到bin目录,然后执行wildfirechat.bat来运行IM服务。
linux文件格式和windows格式是有区别的,如果windows下改动启动脚本后可能会保存为windows格式,在linux上执行会出现错误。请参考服务器问题中的问题3。
6.1. 设置Java的capabilities
IM服务绑定80端口,需要ROOT权限(小于1024的端口都需要ROOT权限)。如果可以以ROOT用户运行或者80端口修改为大于1024的端口,请忽略此项设置。如果无法使用ROOT用户运行IM服务,可以为Java设置绑定端口的权限,命令如下:
sudo setcap CAP_NET_BIND_SERVICE+eip /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
java的路径在不同系统上会有变化,请找到正确的java地址来设置能力。
6.2. 日志
使用nohup启动时,控制台日志会输出到启动目录下的nohup.out
文件。IM服务会在软件包目录下创建一个logs目录,IM服务日志在这个目录下。
6.3. 停止
linux系统下可以使用stop.sh
脚本来停止,另外也可以使用kill <pid>
的方式来停止。需要注意不能使用-9
参数,因为IM服务可能有部分数据还没有写入到数据库,在停止时需要写入数据库,如果用-9
参数可能会丢失数据。
windows系统关闭命令行窗口就结束了,可能有其他更为优雅的方式来结束,我们对windows服务不太了解,也就无法提供了。
6.4. 升级
需要全部使用新版本运行,不能只替换部分文件,可以使用部分旧的配置文件包括wildfirechat.conf
、c3p0.xml
和启动脚本wildfirechat.sh
。因此在升级前,先把这3个文件拷贝出来,解压新压缩包,再把这3个文件拷贝到新项目中。如果是集群部署,还需要配置新项目的hazelcast.xml
文件。
也可以不使用旧项目的配置文件,重新配置所有的配置项。
7. Service方式启动
linux上可以把IM服务做成一个service,这样可以方便的用systemctl
来管理IM服务。有2种方式建立service,一种方法是安装野火提供的安装包,在DEB系系统下使用命令:
sudo apt install ./im-server.deb
在REDHAT系系统下使用命令:
sudo yum localinstall ./im-server.rpm
另外一种办法是用压缩包手动写service,在IM软件压缩包下有个service
目录,里面有手动添加service的详细方法。
无论用那种方式,效果都是一样的。具体操作分别如下:
- 刷新配置,当安装或者更新后需要执行:
sudo systemctl daemon-reload
- 启动服务:
sudo systemctl start im-server
- 停止服务:
sudo systemctl stop im-server
- 重启服务:
sudo systemctl restart im-server
- 查看服务状态:
sudo systemctl status im-server
- 设置开机自启动:
sudo systemctl enable im-server
- 禁止开机自启动:
sudo systemctl disable im-server
7.1. 日志
查看控制台日志使用命令:
journalctl -f -u im-server
logs目录在/var/log/im-server
或者/opt/im-server/logs
下。
7.2. 目录对应关系
在压缩包命令行启动时,关于野火IM的所有文件夹都在一起。当使用service方法运行是,有很多目录分散在多处,下面是他们的位置。
- /etc/im-server/config 配置文件目录
- /opt/im-server 程序目录,除了配置以外的其他软件目录
- /var/log/im-server 日志目录(程序安装的服务产生的日志目录)
- /opt/im-server/logs 日志目录(手动生成Service的服务产生的日志目录)
- /var/lib/im-server/h2db H2数据库目录,如果使用mysql则不会使用
- /var/lib/im-server/media 内置对象存储数据目录,如果使用非内置,则目录不会使用。
7.3. 升级
请先备份/etc/im-server/config
目录下的wildfirechat.conf
、c3p0.xml
和hazelcast.xml
文件,还有/opt/im-server/bin
目录下的wildfirechat.sh
文件,然后使用下属命令卸载im-server
。
deb系系统执行:
sudo apt remove im-server
redhat系系统执行:
sudo yum remove im-server
然后再执行安装命令,当安装完成以后,把wildfirechat.conf
、c3p0.xml
和wildfirechat.sh
文件放到对应目录。如果配置过集群,参考旧文件修改/etc/im-server/config/hazelcast.xml
文件中的关于网络的配置。最后重启验证。
8. Docker 启动方式
8.1. 编译镜像
把专业版IM服务软件包wildfirechat.tar.gz
解压,得到一堆目录,其中有个docker
的目录,再把wildfirechat.tar.gz
拷贝到docker目录下,然后进入到docker目录下,如下命令编译镜像:
sudo docker build -t im-server .
8.2. 运行
配置:
运行需要手动指定配置目录,手动指定配置目录的方法如下,其中$PATH_TO_CONFIG为im配置目录,需要为绝对路径,模版为解压wildfirechat.tar.gz
之后的config
目录。另外需要创建h2数据库目录(如果用mysql就不需要了)、日志目录、内置存储服务目录(如果使用其它对象存储服务就不需要了)。
sudo docker run -it --name im-server -v $PATH_TO_CONFIG:/opt/im-server/config -v $PATH_TO_LOGS:/opt/im-server/logs -v $PATH_TO_H2DB:/opt/im-server/h2db -v $PATH_TO_MEDIA:/opt/im-server/media -e JVM_XMX=256M -e JVM_XMS=256M -p 80:80 -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 18080:18080 -p5701:5701 im-server
8.3. 导出镜像
sudo docker save -o im-server.tar im-server
8.4. 导入镜像
sudo docker load -i im-server.tar
8.5. 日志
使用docker命令来查看控制台日志:
sudo docker logs -f --tail 500 im-server
在启动命令中指定了日志目录,可以在日志目录下找到野火IM服务的日志。
8.6. 升级
需要重新制作docker镜像,配置文件目录要用新的,wildfirechat.conf
和c3p0.xml
文件可以用旧的,如果配置过集群还需要配置hezelcast.xml
文件。
9. K8S启动
野火专业版IM服务在集群配置和集群网络配置比较复杂,我们没有K8S的经验,因此无法给出K8S运行的任何指导。如果客户需要K8S运行,需要先按照普通的方式运行,掌握了集群部署的方法后,再自己来实现在K8S上的运行。目前已知有部分客户使用K8S运行,但也有部分客户尝试后失败。K8S的好处是能够动态伸缩集群,实际上大多数情况下IM服务需要一个稳定的集群,我们不建议使用K8S。