环境
系统:Centos 8.4.2105
docker : 24.0.5
nginx: nginx/1.25.1
后端
宿主机安装
- 后端达成jar包上传到服务器
ps -ef | grep java查看有没有在运行的java项目,要是端口冲突的话,直接killjava -jar没有问题之后,nohup java -jar x.jar > x.log 2>&1 &就可以。
docker内部
-
创建Dockerfile

-
vi Dockerfile1
2
3
4FROM openjdk:8
ADD 18080.jar test.jar
EXPOSE 18080
ENTRYPOINT ["java","-jar","test.jar"]描述:
FROM openjdk:8:拉取基础镜像ADD 18080.jar test.jar:将18080.jar复制到镜像中,重命名成test.jarEXPOSE 18080:声明端口,一般指定的是jar运行端口ENTRYPOINT ["java","-jar","test.jar"]:容器启动之后执行的命令MAINTAINER xx: 添加作者信息 -
构建镜像
1
docker build -t test .
描述:
test:镜像名称.:表示Dockerfile在当前目录下 -
查看镜像
1
docker images
-
运行进行
1
docker run -d --restart=always --name test -p 8080:18080 test
描述:
-d:表示后台运行容器--restart=always:代表容器在停止或者服务器开机之后会自动重启--name test:命名成test-p 8080:18080:端口映射 [宿主机端口]:[容器端口]test:运行的镜像 -
更新jar包
1
docker cp new.jar [容器id]:/test.jar
随后,重启容器
Docker部署可执行jar包-阿里云开发者社区 (aliyun.com)
前端
项目打包
打包之后将项目放在挂载的html目录下,详情查看docker安装nginx | 线上跳转↗️
挂载项目:

将项目挂载到文件夹a里边

配置nginx
修改前的配置文件:

修改后的配置文件:
注意事项
-
要是
jar运行在宿主机(安装dokcer的服务器)上面的话,建议server_name修改成172.17.0.1(这个地址是安装docker之后,默认生成的网桥)。用ifconfig -a可以查看Linux的IP地址
-
不要在
localtion / {}这块里边取写proxy_pass,会网页都打不开。 -
倘若有第二个前端项目的话,同样
html目录下面创建挂载文件夹并把文件存放在内。然后在写一个localtion块,修改一下listen端口。例如:
问题排查:
1.运行jar包服务器卡死
环境:
-
系统:8.5.2111
-
配置:2核2G
-
目标服务:
Minio,frp,docker,nginx,redis,mysql,前端,后端
场景:
服务器运行着Minio,frp,nginx,docker,redis-docker,mysql-docker,前端。将后端jar包上传服务器,
nohup java -jar xx &连接服务器的xshell敲命令执行卡顿,无法重连xshell,随后服务器卡死。
问题排查:
观察到xshell命令还是能敲上的,但是键盘敲击之后,xshell界面很久才能回显,执行也要很久很久,而且重连xshell也是很长时间连接不上。
类似这种反应时间很长,系统出现"死机"的现象,多半是内存不足。
为啥会内存不足呢?
重启服务器之后,重新配置好需要的环境,不运行jar包。查看top命令:

观察其中的进程,注意到有个mysqld占用了22.4%的存,整台服务器的内存是2G,实际运行起来指定没有2048M的,以及其他一些系统支持的,算亏损10%,空闲内存实际约为1850M。刨去mysqld默认占用的1G,实际占用的450M。要想维系整个系统的开支,可用内存也就1G左右。
将jar在开发环境上运行,观察到其占用了开发电脑1000-1300M的内存资源。
解决方案也就呼之欲出了:
-
配置
java -jarJVM的参数,限定其内存大小。例如:1
java -Xmx512M -jar xxx.jar
-
它是Performance Schema 的大小,默认配置是1G。
此时基本解决内存不足问题。
2.jar包运行,CPU飙升至190%
环境:
-
系统:8.5.2111
-
配置:2核2G
-
目标服务器任务进程:
Minio,frp,docker,nginx,redis,mysql,前端,后端
场景:
服务器运行着Minio,frp,nginx,docker,redis-docker,mysql-docker,前端。将后端jar包上传服务器,nohup java -jar xx &后,top指令监测到cpu处在190%附近。
问题排查:
-
通过 命令,查看该进程下的线程资源占用情况。
1
ps -mp pid -o THREAD,tid,time
-
将其中%CPU高的线程TID进行转码
1
print "%x\n" TID
-
通过查看cpu占用很高的线程状态
1
jstack PID | grep [0xTID:第二部转码出来的tid]
-
如果线程还处在Runnable状态,那么通过
jstack去找到详情。如果问题指向代码,那就去修改。 -
到此基本解决。
当然,还有个情况就是,正常启动直接拉爆,随后又静默到1%的,查线程高占用的都停止了,这种情况下,倘若后期还有MQ什么的其他服务要用的话,建议将升级到4核cpu。