抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

环境

系统:Centos 8.4.2105

docker : 24.0.5

nginx: nginx/1.25.1

后端

宿主机安装

  1. 后端达成jar包上传到服务器
  2. ps -ef | grep java查看有没有在运行的java项目,要是端口冲突的话,直接kill
  3. java -jar没有问题之后,nohup java -jar x.jar > x.log 2>&1 & 就可以。

docker内部

  1. 创建Dockerfile

  2. vi Dockerfile

    1
    2
    3
    4
    FROM 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.jar

    EXPOSE 18080:声明端口,一般指定的是jar运行端口

    ENTRYPOINT ["java","-jar","test.jar"]:容器启动之后执行的命令

    MAINTAINER xx: 添加作者信息

  3. 构建镜像

    1
    docker build -t test .

    描述:

    test:镜像名称

    .:表示Dockerfile在当前目录下

  4. 查看镜像

    1
    docker images
  5. 运行进行

    1
    docker run -d --restart=always --name test -p 8080:18080 test

    描述:

    -d:表示后台运行容器

    --restart=always:代表容器在停止或者服务器开机之后会自动重启

    --name test:命名成test

    -p 8080:18080:端口映射 [宿主机端口]:[容器端口]

    test:运行的镜像

  6. 更新jar包

    1
    docker cp new.jar [容器id]:/test.jar

    随后,重启容器

Docker部署可执行jar包-阿里云开发者社区 (aliyun.com)

前端

项目打包

打包之后将项目放在挂载的html目录下,详情查看docker安装nginx | 线上跳转↗️

挂载项目:

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

配置nginx

修改前的配置文件:

修改后的配置文件:

注意事项
  1. 要是jar运行在宿主机(安装dokcer的服务器)上面的话,建议server_name修改成172.17.0.1(这个地址是安装docker之后,默认生成的网桥)。用ifconfig -a可以查看LinuxIP地址

  2. 不要在 localtion / {}这块里边取写 proxy_pass,会网页都打不开。

  3. 倘若有第二个前端项目的话,同样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
  • 从mysqld上解决,参考1 参考2

    它是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. 通过 命令,查看该进程下的线程资源占用情况。

    1
    ps -mp pid -o THREAD,tid,time
  2. 将其中%CPU高的线程TID进行转码

    1
    print "%x\n" TID
  3. 通过查看cpu占用很高的线程状态

    1
    jstack PID | grep [0xTID:第二部转码出来的tid]
  4. 如果线程还处在Runnable状态,那么通过jstack去找到详情。如果问题指向代码,那就去修改。

  5. 到此基本解决。

当然,还有个情况就是,正常启动直接拉爆,随后又静默到1%的,查线程高占用的都停止了,这种情况下,倘若后期还有MQ什么的其他服务要用的话,建议将升级到4核cpu。

评论