记录一次linux系统服务器部署java系统从0到有的过程

        首先说一下心得吧!刚开始拿到这个任务的时候很懵,因为我之前也就是在学校跟着导师学过一些虚拟机,但是我们在安装的时候会有可视化窗口,相对来说看着亲和许多,但是这个是一个实体机纯命令窗口所以看起来很恐怖,总感觉一不小心可能就把系统弄坏了,也是一路小心翼翼的安装,各种百度参考看各位大神是怎么做的,虽然一波三折最后也算完成啦!做IT就是不断的学习,不要害怕困难,问题解决对自己来说也算是一种提升!文末会介绍一些我在安装途中遇到在网上没有查到解决办法,最终凭着参考相关资料和几天的安装配置经验解决的问题

        1、 介绍一下用到哪些技术和中间件。

数据库:neo4j、influxdb、postgre;

后端:java、SpringBoot

工具中间件:Nginx、elk、Nacos、JDK8、11

前端:vue

        2、开始安装配置环境

(1)JDK8

        我在安装之前先检查了一下jdk是否安装了,发现已经有了openjdk8,所以我就没有自己安装。在网上找了一个安装jdk的教程https://blog.csdn.net/qq_39390545/article/details/111769675

(2)JDK11

       说明一下,有了8为什么还要11,因为有些中间件启动依赖Java环境,比如nacos、neo4j。neo4j比较新的版本还要依赖于11,所以先下载安装一下,因为java环境已经有了,11也就是现在安装包解压一下,需要用到时直接Java_HOME=安装路径即可。

        下载安装包,官网路径 http://www.oracle.com/technetwork/java/javase/archive-139210.html

        创建一个目录,将下载的安装包解压到路径下,自己做记录,方便后来要用时找到。

        记录几个命令:

#创建多级目录
mkdir -p 路径 
#解压压缩包
tar -zxvf  文件名

(3)PostgreSQL

        安装服务

yum install postgresql-server

        初始化数据库

postgresql-setup initdb

        设置ip能访问,默认安装路径是/var/lib/pgsql/data,编辑配置文件listen_addressses='*';

#切到安装目录
cd /var/lib/pgsql/data

#编辑配置文件
vi postgresql.conf

#设置网络访问修改成listen_addressses='*'

        设置开机启动,启动数据库

systemctl enable postgresql && systemctl start  postgresql

        修改默认密码

#登录PostgreSQL
sudo -u postgres psql

#修改登录PostgreSQL密码,命令以;结尾
ALTER USER postgres WITH PASSWORD '新密码';

#退出PostgreSQL客户端
\q

(4)InfluxDB

        下载并且安装

wget https://dl.influxdata.com/influxdb/releases/influxdb-1.8.4.x86_64.rpm
sudo yum localinstall influxdb-1.8.4.x86_64.rpm

        默认路径

#默认的配置文件
/etc/influxdb/influxdb.conf
#日志文件
/var/log/influxdb/influxd.log
#数据文件
/var/lib/influxdb/data
#初始化脚本文件
/usr/lib/influxdb/scripts

        到达目录 /usr/lib/systemd/system  下 创建influxdb.service 文件    复制以下内容

[Unit]


Description=influxdb


Documentation=https://v2.docs.influxdata.com/v2.0/get-started/


After=network.target


[Service]


ExecStart=/usr/bin/influxd


Restart=on-failure


[Install]


WantedBy=multi-user.target

        设置开机启动并启动

systemctl enable influxdb && systemctl start influxdb

        由于我们的系统是在内部局域网使用所以很多都是默认配置,这里influxdb默认不需要用户认证,如果需要的话可以修改配置文件打开用户认证,设置用户密码,具体操作这里不介绍。

(5)Nacos

        下载安装

        Nacos是Java项目,Java是跨平台的,所以Nacos安装包无所谓是windows还是linux版本。

将安装包解压到一个路径下面

        创建nacos.service文件配置成自定义服务,方便启动

#创建文件
vim /lib/systemd/system/nacos.service

#编辑内容,注意启动路径需要修改
[Unit]
Description=nacos
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nacos/nacos/bin/startup.sh -m standalone
ExecReload=/usr/local/nacos/nacos/bin/shutdown.sh
ExecStop=/usr/local/nacos/nacos/bin/shutdown.sh
PrivateTmp=true
[Install]  
WantedBy=multi-user.target

        设置开机启动并且启动

systemctl enable nacos && systemctl start nacos

(6)Docker安装

        下载安装 链接:

 https://download.docker.com/linux/static/stable/x86_64/

#解压  
tar -zxvf docker-20.10.7.tgz

#将解压出来的docker文件复制到 /usr/bin/ 目录下 
cp docker/* /usr/bin/

#进入/etc/systemd/system/目录,并创建docker.service文件
cd /etc/systemd/system/
touch docker.service

#打开docker.service文件,将以下内容复制
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target


[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd --selinux-enabled=false --insecure-registry=192.168.200.128
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s


[Install]
WantedBy=multi-user.target

#给docker.service文件添加执行权限
chmod 777 /etc/systemd/system/docker.service

#重新加载配置文件(每次有修改docker.service文件时都要重新加载下)
systemctl daemon-reload

#启动
systemctl start docker

#设置开机启动
systemctl enable docker.service

#重启
systemctl restart docker 

(7)elk

        由于elk平常安装维护的少,完全是参考一位大神写的博客,照着一步步做的,这里就直接去看大神的博客吧!

https://blog.csdn.net/m0_62877071/article/details/128210237

        需要注意的是SpringBoot版本有对应的elk版本,docker的版本不够新的话,可能没有elk的一些镜像,安装之前最好先了解一下。

(8)Nginx

        下载安装

docker pull nginx

        启动

#后面一个nginx代表的是镜像名称,可能需要带上版本号,例如ngnix:latest
docker run --name nginx -p 80:80 -d nginx

        映射文件,方便后期更新网站

#创建映射文件
mkdir -p /data/nginx/{conf,conf.d,html,logs}

#复制文件到创建的文件夹下
docker cp nginx:/etc/nginx/nginx.conf /data/nginx/
docker cp nginx:/etc/nginx/conf.d /data/nginx/conf/
docker cp nginx:/usr/share/nginx/html/ /data/nginx/html/
docker cp nginx:/var/log/nginx/ /data/nginx/logs/

#停止容器
docker stop ngnix

#移除容器
docker rm nginx

#带着映射文件启动,后面一个nginx代表的是镜像名称,可能需要带上版本号,例如ngnix:latest
docker run --name nginx -p 80:80 -v /data/nginx/nginx.conf:/etc/nginx/nginx.conf -v /data/nginx/html/:/usr/share/nginx/html/ -v /data/nginx/logs/:/var/log/nginx/ -v /data/nginx/conf/:/etc/nginx/conf.d --privileged=true -d nginx

        文件映射好了,接下来只需要把网站放到html下面就可以访问了。

        如果需要多个网站,可以再建一个文件夹例如ngnix81,再把nginx81文件映射一下,映射启动时把路径换一下,启动端口换一下即可

#带着映射文件启动,后面一个nginx代表的是镜像名称,可能需要带上版本号,例如ngnix:latest
docker run --name nginx -p 81:80 -v /data/nginx81/nginx.conf:/etc/nginx/nginx.conf -v /data/nginx81/html/:/usr/share/nginx/html/ -v /data/nginx81/logs/:/var/log/nginx/ -v /data/nginx81/conf/:/etc/nginx/conf.d --privileged=true -d nginx

(9)利用Dockerfile部署java服务

        创建文件夹,文件夹中放两个东西  一个dockerfile,一个jar包 

        dockerfile内容

FROM openjdk:8
VOLUME /tmp
ADD znjp-workflowList-3.0-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT [ "java", "-Duser.timezone=GMT+08 -Xms512m -Xmx512m -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512m", "-jar", "/app.jar"]

        内容代码不难分析,大概意思就是把java定义成一个jar,和java启动参数

        操作镜像、容器命令

#打包镜像
docker build -t znjp-workflow .

#启动容器
docker run -p 22438:22438 -e TZ=Asia/Shanghai -d  --restart=always --name znjp-workflow -m 600m -v /home/local/share:/home/local/share  -v/etc/localtime:/etc/localtime znjp-workflow 

#查看日志
docker logs -f --tail 100  znjp-workflow 

#查看容器
docker ps

#停止容器
docker stop 名称/id

#删除
docker rm 名称/id

#查看镜像
docker images

#删除镜像
docker rmi 名称/id

        注意这样部署,每次更新jar包都需要停止容器、删除容器、删除镜像、创建镜像、启动容器

(10)开放端口访问

        因为防火墙原因,如果不开放端口,就算是同一个局域网也是不能访问到刚才部署的东西,下面是一些命令:

常用命令:
systemctl start firewalld #启动
systemctl stop firewalld #停止
systemctl status firewalld #查看状态
systemctl disable firewalld #开机禁用
systemctl enable firewalld #开机启动

开放或关闭端口:
firewall-cmd --zone=public --add-port=80/tcp --permanent #开放80/tcp端口 (--permanent永久生效,没有此参数重启后失效)
firewall-cmd --zone=public --query-port=80/tcp #查看80/tcp端口
firewall-cmd --zone=public --remove-port=80/tcp --permanent #关闭80/tcp端口

批量开放或关闭端口:
firewall-cmd --zone=public --add-port=40000-45000/tcp --permanent #批量开放端口,打开从40000到45000之间的所有端口
firewall-cmd --zone=public --list-ports #查看系统所有开放的端口
firewall-cmd --zone=public --remove-port=40000-45000/tcp --permanent #批量关闭端口,关闭从40000到45000之间的所有端口

更新防火墙的设置:
firewall-cmd --reload #更新防火墙的设置,使上面的修改生效

        可以选择直接关闭防火墙,但是不建议这样做,要是被攻击了导致一些后果,可能是我们没法承担的,最好就是开放需要的端口。

3、遇到的几个问题及解决办法

(1)服务部署以后微服务之间不能相互调用

        刚开始以为是防火墙的问题,搞了半天发现还是不行,最后看到一个帖子说的大概是docker启动时-p参数,然后在java服务容器启动时加上-p 11440:11440得以解决,意思就是端口映射,容器内部端口映射到主机的端口,前面是宿主机端口号,后面是容器端口号,也就是jar在nacos配置中心中配置的启动端口。

(2)服务部署以后服务不能访问宿主机已经有的文件

        有了第一个问题的经验,猜到可能是因为文件路径没有映射,然后在java服务容器启动时加上-v /download/temp:/download/temp得以解决,意思就是文件路径映射,容器内部文件路径映映射到主机的文件路径映,前面是宿主机文件路径映,后面是文件路径映。

(3)服务部署以后占用的运行内存越来越大

        我一共部署了四十多个服务,服务部署以后过了半天发现128g运行内存的服务器只剩一两个g运行内存了,而且发现好多服务响应时间都非常的长,甚至不响应了,去服务器上看的时候也卡的要死,还有服务OOM了。

        很纳闷,因为我在dockerfile文件里面已经设置了最大内存,四十几个服务怎么也不可能达到128g,在网上看了很多帖子,最后找到一个关于容器在启动时设置最大内存的,刚开始感觉不太可能是因为这个,然后查看了一下运行内存占用详细信息,发现每个java程序都是一两个g甚至更大,然后就试试看看可不可行,由于机器基本已经卡死了,只能硬件强制重启服务器,然后每个启动参数都带上-m 600m得以解决,意思就是设置一个容器使用内存最大值,具体数字可以根据需要更改。

(4)配置静态ip问题

        在配置网络时,还遇到一个问题。由于我们系统是欧拉的,有些文件名称和centos的不太一样,再加上我对这个不太懂,然后我就把eno1配置成静态ip了,导致系统两个ip,在ifconfig的时候eno1和eno3都是同一个ip,这样一来无论是我ping其他ip还是其他ip来ping这个都不通,自己也不知道是这个问题,后来就在网上看到都是配置的ens3文件,我也感觉两个ip很奇怪,然后就把eno1恢复了,把eno3配置成静态ip,重启以后得以解决。

(5)解决容器服务可以用127.0.0.1ip访问

        在第一个问题中映射了端口,虽然能通过宿主机ip加端口访问,但是我们的服务器可能会迁移,这样一来迁移一次就得全部服务的配置ip都要改一次,很麻烦!!!于是就想用127.0.0.1的ip启动服务,可是这样启动是有问题的,由于容器都是单独的ip,如果配置成127.0.0.1启动服务是不能互相调用的。请教了一下用过docker的兄弟,说是加一个启动参数可以实现127.0.0.1的ip访问,试了一下是可以行得通的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值