操作步骤

1.1 安装JDK

课程资料中已经提供:jdk-11.0.16_linux-x64_bin.tar.gz

JDK具体安装步骤如下:

1). 上传安装包

使用FinalShell自带的上传工具将jdk的二进制发布包上传到Linux(箭头里面指向的jdk8只是个示例,传自己需要的安装包即可)

由于上述在进行文件上传时,选择的上传目录为/root,上传完毕后,进入到/root目录查看上传的安装包。

image-20230904195455230
image-20230904195455230

2). 解压安装包

执行如下指令,将上传上来的压缩包进行解压,并通过-C参数指定解压文件存放目录为 /usr/local。

tar -zxvf jdk-11.0.16_linux-x64_bin.tar.gz -C /usr/local
image-20210814181014481
image-20210814181014481

3). 配置环境变量

使用vim命令修改/etc/profile文件,在文件末尾加入如下配置

JAVA_HOME=/usr/local/jdk-11.0.16
PATH=$JAVA_HOME/bin:$PATH

具体操作指令如下:

1). 编辑/etc/profile文件,进入命令模式
    vim /etc/profile

2). 在命令模式中,输入指令 G , 切换到文件最后
    G

3). 在命令模式中输入 i/a/o 进入插入模式,然后切换到文件最后一行
    i

4). 将上述的配置拷贝到文件中
    JAVA_HOME=/usr/local/jdk-11.0.16
    PATH=$JAVA_HOME/bin:$PATH
    
5). 从插入模式,切换到指令模式
    ESC
    
6). 按:进入底行模式,然后输入wq,回车保存
    :wq

4). 重新加载profile文件

为了使更改的配置立即生效,需要重新加载profile文件,执行命令:

source /etc/profile

5). 检查安装是否成功

java -version
image-20210814182327675
image-20210814182327675

1.2 安装MySQL(废弃)

1.2.1 MySQL安装

对于MySQL数据库的安装,我们将要使用前面讲解的第二种安装方式rpm进行安装。那么首先我们先了解一下什么rpm?

RPM:全称为 Red-Hat Package Manager,RPM软件包管理器,是红帽Linux用于管理和安装软件的工具。

我们要通过rpm,进行MySQL数据库的安装,主要的步骤如下:

1). 检测当前系统是否安装过MySQL相关数据库

需要通过rpm相关指令,来查询当前系统中是否存在已安装的mysql软件包,执行指令如下:

rpm -qa                            查询当前系统中安装的所有软件
rpm -qa | grep mysql            查询当前系统中安装的名称带mysql的软件
rpm -qa | grep mariadb            查询当前系统中安装的名称带mariadb的软件

通过rpm -qa 查询到系统通过rpm安装的所有软件,太多了,不方便查看,所以我们可以通过管道符 | 配合着grep进行过滤查询。

image-20210815002209121
image-20210815002209121

通过查询,我们发现在当前系统中存在mariadb数据库,是CentOS7中自带的,而这个数据库和MySQL数据库是冲突的,所以要想保证MySQL成功安装,需要卸载mariadb数据库。

2). 卸载现有的MySQL数据库

在rpm中,卸载软件的语法为:

rpm -e --nodeps  软件名称

那么,我们就可以通过指令,卸载 mariadb,具体指令为:

rpm -e --nodeps  mariadb-libs-5.5.60-1.el7_5.x86_64
image-20210815002649784
image-20210815002649784

我们看到执行完毕之后, 再次查询 mariadb,就查不到了,因为已经被成功卸载了。

3). 将资料中提供的MySQL安装包上传到Linux并解压

A. 上传MySQL安装包

在课程资料中,提供的有MySQL的安装包 ,我们需要将该安装包上传到Linux系统的root目录 下面。

image-20210815002907050
image-20210815002907050
image-20230905183347602
image-20230905183347602

B. 解压到/usr/local/mysql

执行如下指令:

mkdir /usr/local/mysql
tar -zxvf mysql-5.7.25-1.el7.x86_64.rpm-bundle.tar.gz -C /usr/local/mysql
image-20210815003647507
image-20210815003647507

4). 安装顺序安装rpm安装包

cd /usr/local/mysql
rpm -ivh mysql-community-common-5.7.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-devel-5.7.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-compat-5.7.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.25-1.el7.x86_64.rpm
yum install net-tools
yum -y install numactl
rpm -ivh mysql-community-server-5.7.25-1.el7.x86_64.rpm

如果报错:

image-20240801163945390
image-20240801163945390

先执行:sudo yum install -y libaio

再执行:rpm -ivh mysql-community-server-5.7.25-1.el7.x86_64.rpm

1.2.2 MySQL启动

MySQL安装完成之后,会自动注册为系统的服务,服务名为mysqld。那么,我们就可以通过systemctl指令来查看mysql的状态、启动mysql、停止mysql。

systemctl status mysqld        查看mysql服务状态
systemctl start mysqld        启动mysql服务
systemctl stop mysqld        停止mysql服务
image-20210815005920721
image-20210815005920721

说明:

​ 可以设置开机时启动mysql服务,避免每次开机启动mysql。执行如下指令:

​ systemctl enable mysqld

我们可以通过如下两种方式,来判定mysql是否启动:

netstat -tunlp                    查看已经启动的服务
netstat -tunlp | grep mysql        查看mysql的服务信息

ps –ef|grep mysql                查看mysql进程
image-20210815010410996
image-20210815010410996

备注:

A. netstat命令用来打印Linux中网络系统的状态信息,可让你得知整个Linux系统的网络情况。

​ 参数说明:

​ -l或--listening:显示监控中的服务器的Socket;
​ -n或--numeric:直接使用ip地址,而不通过域名服务器;
​ -p或--programs:显示正在使用Socket的程序识别码和程序名称;
​ -t或--tcp:显示TCP传输协议的连线状况;
​ -u或--udp:显示UDP传输协议的连线状况;

B. ps命令用于查看Linux中的进程数据。

1.2.3 MySQL登录

1.2.3.1 查阅临时密码

MySQL启动起来之后,我们就可以测试一下登录操作,但是我们要想登录MySQL,需要一个访问密码,而刚才在安装MySQL的过程中,并没有看到让我们设置访问密码,那这个访问密码是多少呢? 那实际上,对于rpm安装的mysql,在mysql第一次启动时,会自动帮我们生成root用户的访问密码,并且输出在mysql的日志文件 /var/log/mysqld.log中,我们可以查看这份日志文件,从而获取到访问密码。

可以执行如下指令:

1). cat /var/log/mysqld.log

image-20210815011744113
image-20210815011744113

这种方式,可以看到所有的日志数据,文件比较大时,很不方便查看数据。我们可以通过管道符 | 配合grep来对数据进行过滤。

2). cat /var/log/mysqld.log | grep password

我们可以通过上述指令,查询日志文件内容中包含password的行信息。

image-20210815011938287
image-20210815011938287
1.2.3.2 登录MySQL

获取到root用户的临时密码之后,我们就可以登录mysql数据库,修改root的密码,为root设置一个新的密码。并且我们还需要开启root用户远程访问该数据库的权限,这样的话,我们就可以在windows上来访问这台MySQL数据库。

执行如下指令:

①. 登录mysql(复制日志中的临时密码登录)
    mysql -uroot -p                                

②. 修改密码
    set global validate_password_length=4;            设置密码长度最低位数
    set global validate_password_policy=LOW;        设置密码安全等级低,便于密码可以修改成root
    set password = password('Rootitcast');                设置密码为root
  
3.允许远程访问
use mysql  # 进入mysql库
select host,user from user;  # 查看用户权限表


update user set host = '%' where user = 'root';  # 设置root用户的权限允许非localhost登录(% 代表所有)
FLUSH PRIVILEGES;  # 刷新数据库配置

操作完上述的指令之后,数据库root用户的密码以及远程访问我们就配置好了,接下来,可以执行exit退出mysql,再次通过新的密码进行登录。

image-20210815012902871
image-20210815012902871

当然我们也可以使用安装在windows系统中的sqlyog或者Navicat来远程连接linux上的MySQL。

image-20210815013909486
image-20210815013909486

注意: 要想在windows上能够访问MySQL,还需要开放防火墙的3306端口

1.3 安装Redis

1.3.1 redis安装

Redis的安装和上述JDK的安装采用相同的方式,都是使用二进制发布包的形式进行安装,在我们的资料目录下,也已经准备了安装包:

redis-6.2.6.tar.gz

具体安装步骤如下:

1). 上传安装包

使用FinalShell自带的上传工具将redis上传到服务器任意目录。

2). 解压安装包

进入到对应目录,将上传上来的安装包解压,执行命令为

tar -vxzf redis-6.2.6.tar.gz

3). 移动redis目录,一般都会将redis目录放置到 /usr/local/redis目录

mv redis-6.2.6 /usr/local/redis

4). 进入redis安装目录,执行make命令编译redis

cd /usr/local/redis
make

如果执行make命令报错:cc 未找到命令,原因是虚拟机系统中缺少gcc,执行下面命令安装gcc:

yum -y install gcc automake autoconf libtool make

如果执行make命令报错:致命错误:jemalloc/jemalloc.h: 没有那个文件或目录,则需要在make指定分配器为libc。执行下面命令即可正常编译:

make MALLOC=libc

make命令执行完,redis就编译完成了

5). 执行下面命令安装redis,并指定安装目录

make install PREFIX=/usr/local/redis

6).修改redis.conf,使其支持其他IP地址能访问,否则只有本机可以访问

vi redis.conf

搜索(命令模式下输入/):bind 127.0.0

image-20230905172130766
image-20230905172130766

在bind前面加#

把保护模式更改为no

image-20230907112044887
image-20230907112044887

启用redis密码,稍微复杂点,切记!!!(否则会被黑客攻击)

image-20230908080608696
image-20230908080608696

1.3.2 redis启动

1、进入redis安装目录,执行下面命令启动redis服务

./bin/redis-server redis.conf

但这种启动方式不能退出控制台,如果退出,那么redis服务也会停止。如果想要redis以后台方式运行,需要修改redis的配置文件:redis.conf。将该配置文件中的daemonize no改为daemonize yes即可

修改完成后,重新执行启动命令启动redis。

可以通过命令:ps -ef | grep redis 查看结果

云主机注意开放6379端口!!!

1.4 安装nginx

安装EPEL存储库

sudo yum install epel-release

安装nginx

sudo yum install nginx

启动

sudo systemctl start nginx

验证nginx是否启动

sudo systemctl status nginx
image-20230904211158208
image-20230904211158208

浏览器访问:http://ip (ip为自己服务器IP)

image-20230904211228586
image-20230904211228586

显示这页面是因为nginx的默认页面长这样

1.5 安装lrzsz(选装)

lrzsz 是用于在Linux系统中文件上传下载的软件。大家可能会存在疑问,我们用finalShell图形化界面就可以很方便的完成上传下载,为什么还要使用这个软件来完成上传下载呢?实际上是这样的,Linux的远程连接工具有很多,而finalShell只是其中的一种,而还有很多的远程连接工具并没有上传下载的功能,这个时候就需要依赖于lrzsz这个软件了。

对于lrzsz的安装,我们需要通过第三种软件安装方式yum来进行安装。这里,我们先对yum做一个简单介绍。

Yum: (Yellow dog Updater,Modified),是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。

安装lrzsz的步骤如下:

1). 搜索lrzsz安装包

yum list lrzsz
image-20210815014811466
image-20210815014811466

2). 在线安装lrzsz

yum install lrzsz.x86_64
image-20210815014907816
image-20210815014907816

3). 测试

在命令行中输入 rz , 就会自动打开一个文件选择的窗口,然后选择要上传的文件。

image-20210815015047896
image-20210815015047896

yum拓展知识:

​ 1). 如果在不更改软件来源的情况下,是需要联网才能使用yum的,那么我们安装的软件是从哪儿下载的呢,这里就涉及到一个概念: yum源。

​ 2). 我们可以通过一个指令,来检查当前的yum源

image-20210816192200749
image-20210816192200749

​ 从图中,我们可以看到我们安装的 CentOS7 采用的是网易的163yum源。

​ 3). 网络 yum 源配置文件位于 /etc/yum.repos.d/ 目录下,文件扩展名为"*.repo"

image-20210816193941094
image-20210816193941094

​ 可以看到,该目录下有 7 个 yum 配置文件,通常情况下 CentOS-Base.repo 文件生效。

​ 4). 添加阿里云yum源

​ A. 先通过 yum install wget ,安装wget命令

​ B. 备份默认的网易163的yum源,执行指令 :

​ 切换目录: cd /etc/yum.repos.d/

​ 创建备份目录: mkdir bak

​ 移动现有的yum源文件到bak: mv *.repo bak/

​ C. 下载阿里云的yum源

​ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

​ D. 执行命令,重新生成cache

​ yum clean all

​ yum makecache

​ E. 再次查看yum源

image-20210816214230609
image-20210816214230609

​ 之后,我们通过yum命令安装软件,就是从阿里云下载的。

2. 项目部署(上线)

之前我们讲解Linux操作系统时,就提到,我们服务端开发工程师学习Linux系统的目的就是将来我们开发的项目绝大部分情况下都需要部署在Linux系统中。

那么在本章节,我们将通过两种方式,来演示项目部署(部署苍穹外卖项目),分别:手动部署项目 和 基于jenkins自动部署。

部署(上线)方案

1.直接自己打包自己扔到生产环境,然后重启(mini公司)

2.公司自研的发布系统,由测试人员进入编译、打包、发布(稍微有点实力的公司、大厂);

3.Jenkins发布

4.其他devops平台(阿里云效平台、禅道、TPAD、k8s、宝塔)

2.1 手动部署项目

部署后端

1). 项目需要的软件安装

​ 比如:mysql、redis、JDK等

2).修改项目配置文件

新增生产环境配置文件application-prod.yml,并将application.yml中的active改为prod

image-20230905195648324
image-20230905195648324

3).将项目打包

执行package或者install

image-20230905200029588
image-20230905200029588

4). 将jar包上传到Linux服务器

将打好的jar包上传至Linux服务器的 /root/app 目录下。 先执行指令创建app目录。

image-20230905200227288
image-20230905200227288

5).启动项目

执行命令:

java -jar sky-server-1.0-SNAPSHOT.jar

可以看到当前启用的配置文件为prod,以及启动成功标志(标红线部分)

image-20230905200838671
image-20230905200838671

6).访问测试

首先保证需要访问的端口是通的

image-20230905201218591
image-20230905201218591

7). 后台运行项目

当前这个苍穹外面后端工程我们已经部署成功了,并且我们也可以访问项目了。但是这个工程目前是存在问题的,就是当前我们项目启动的这个窗口被霸屏占用了,如果我们把这个窗口关闭掉(或ctrl+c),当前服务也就访问不到了,我们可以试一下。

image-20230905201504807
image-20230905201504807

目前程序运行的问题:

A. 线上程序不会采用控制台霸屏的形式运行程序,而是将程序在后台运行

B. 线上程序不会将日志输出到控制台,而是输出到日志文件,方便运维查阅信息

后台运行程序:

要想让我们部署的项目进行后台运行,这个时候我们需要使用到linux中的一个命令 nohup ,接下来,就来介绍一下nohup命令。

nohup命令:英文全称 no hang up(不挂起),用于不挂断地运行指定命令,退出终端不会影响程序的运行

语法格式: nohup Command [ Arg … ] [&]

参数说明:

​ Command:要执行的命令

​ Arg:一些参数,可以指定输出文件

​ &:让命令在后台运行

举例:

​ nohup java -jar boot工程.jar &> hello.log &

​ 上述指令的含义为: 后台运行 java -jar 命令,并将日志输出到hello.log文件

那么经过上面的介绍,我们可以推测中,我们要想让当前部署的项目后台运行,就可以使用下面的指令:

nohup java -jar sky-server-1.0-SNAPSHOT.jar &> sky.log &

我们可以通过ps指令,查看到系统的进程。

image-20230905201726189
image-20230905201726189

一般还有去看下启动日志,看下是否正常

tail -f sky.log

接下来,我们再次访问我们的项目,来看看服务是否可用。

image-20230905201747834
image-20230905201747834

也可以用tail命令查看系统实时日志:

tail -f sky.log
image-20230905201934778
image-20230905201934778

8). 停止SpringBoot项目

image-20230905202155876
image-20230905202155876

9).最佳实践

用脚本的方式启动项目,将资料里面的service.sh上传到jar包所在目录,并赋予执行权限

chmod +x service.sh
image-20230905202731243
image-20230905202731243

启动项目用命令:

./service.sh restart
image-20230905202847497
image-20230905202847497

用tail命令去servcie.sh配置的日志目录下查看启动日志

image-20230905203404730
image-20230905203404730

可以看出,当前启动日志在当前目录下的logs文件夹下的run.out

tail -f logs/run.out

注意:每次手动发版上传jar包前先备份,以便当前发版失败好快速回滚,一般按日期备份,比如:

cp sky-server-1.0-SNAPSHOT.jar sky-server-1.0-SNAPSHOT.jar.20230905
image-20230905203214914
image-20230905203214914

启动项目报如下错误解决方案:

Caused by: java.lang.NullPointerException: null

    at java.desktop/sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1262)
    at java.desktop/sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:225)


依次执行下面两个命令:
yum install fontconfig
fc-cache

然后重启java服务

部署前端

将前端静态资源文件打包上传到目录 /usr/share/nginx/html

image-20230905203927773
image-20230905203927773

解压缩sky.zip

cd /usr/share/nginx/html

unzip sky.zip 

修改nginx.conf配置文件

cd /etc/nginx

#先备份,以防修改错误方便回滚
cp nginx.conf nginx.conf.bak

vim nginx.conf

新增反向代理部分:

    # 反向代理,处理管理端发送的请求
    location /api/ {
        proxy_pass   http://localhost:8080/admin/;
    }


image-20230905204711033
image-20230905204711033

然后重新加载nginx配置使其生效

nginx -s reload

打开前端页面,测试系统,nginx配置的默认端口是80(如果打不开,注意核对在云服务器管理端安全组开放80端口),直接在浏览器中输入IP即可

image-20230905205221563
image-20230905205221563
image-20230905205241967
image-20230905205241967

2.2 基于jenkins自动部署

基于人工部署操作步骤如下:

1). 在本地打可运行的jar包

2). 上传代码到服务器

3). 然后启动项目

有没有办法能自动完成这个操作?

2.2.1 介绍

image-20230905211632405
image-20230905211632405

2.2.2 安装jenkins

1). jenkins安装包下载

走国外官网很慢,可在国内清华的镜像上下载,地址:https://mirrors.tuna.tsinghua.edu.cn/

image-20230904201043076
image-20230904201043076

点击war,下载对应的版本,可选最新版

image-20230904201104403
image-20230904201104403

或者资料里面提供已经下载好的jenkins.war包

2).上传jenkins.war到服务器/root目录下(非必须此目录)

3). 启动jenkins

cd root
#注意端口冲突 jenkins默认是8080端口,可以指定端口启动
java -jar jenkins.war --httpPort=8081

如果报错:

image-20230904201354310
image-20230904201354310

原因:缺少字体

解决方案:

yum install fontconfig

然后再重新执行命令:java -jar jenkins

启动过程中会提示Jenkins的root用户的默认密码在哪里

image-20230904201523076
image-20230904201523076

3). 访问jenkins

IP:8081,即可访问Jenkins,第一次初始化比较耗时需要耐心等待

image-20230904201806564
image-20230904201806564

从控制台复制密码填入

最好选择自定义插件,推荐的插件太多,下载慢

image-20230904202116695
image-20230904202116695

点击“无”,去掉默认勾选的插件

image-20230904202222483
image-20230904202222483

点击安装,然后继续下一步

可以直接选择使用管理员账户继续,也可以创建一个账户:

建议使用admin账户继续,登陆后修改一下密码即可

image-20230904202453479
image-20230904202453479

安装必要的插件

image-20230905213048693
image-20230905213048693

安装git插件

image-20230906080140608
image-20230906080140608

安装ssh插件

image-20230906082501337
image-20230906082501337

安装maven插件

image-20230906094511145
image-20230906094511145

2.2.3 Git安装

1). Git软件安装

通过yum命令在线安装git,执行如下指令:

yum list git            列出git安装包
yum install git            在线安装git

通过上述指令,安装好git之后,我们就可以通过 git --version去验证git的环境。

image-20210815145934265
image-20210815145934265

2.2.4 Maven安装

由于我们的工程是maven工程,我们要想进行项目的编译打包,需要用到maven的指令,所以需要安装maven。具体操作步骤如下:

1). 上传资料中提供的maven的安装包

通过rz指令上传课程资料中的maven安装包

image-20210815151544489
image-20210815151544489
image-20230905213822831
image-20230905213822831

2). 解压maven安装包到/usr/local目录

tar -zxvf apache-maven-3.5.4-bin.tar.gz -C /usr/local
image-20210815152033246
image-20210815152033246

3). 在/etc/profile配置文件中配置环境变量

vim /etc/profile

修改配置文件,进入到命令模式,按G切换到最后一行,按a/i/o进入插入模式,然后在最后加入如下内容 :
export MAVEN_HOME=/usr/local/apache-maven-3.5.4
export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH

然后按ESC进入到命令模式,输入 :wq 保存并退出
image-20210815152321369
image-20210815152321369

要想让配置的环境变量生效,还需要执行如下指令:

source /etc/profile
image-20210815152616703
image-20210815152616703

4). 修改maven的settings.xml配置文件,配置本地仓库地址

A. 切换目录

cd /usr/local/apache-maven-3.5.4/conf

B. 编辑settings.xml配置文件

vim settings.xml

在其中增加如下配置,配置本地c仓库地址:

<localRepository>/usr/local/repo</localRepository>
image-20210815152936129
image-20210815152936129

并在settings.xml中的标签中,配置阿里云的私服(选做):

<mirror> 
    <id>alimaven</id> 
    <mirrorOf>central</mirrorOf> 
    <name>aliyun maven</name> 
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror> 
image-20210815170915170
image-20210815170915170

2.2.5 配置jenkins

1.配置jdk git maven

image-20230906075808323
image-20230906075808323
image-20230906075909613
image-20230906075909613
image-20230906080025904
image-20230906080025904
image-20230906081829802
image-20230906081829802

2.配置git凭据

image-20230906081936579
image-20230906081936579
image-20230906091927489
image-20230906091927489
image-20230906082114932
image-20230906082114932

3).配置远程服务器

image-20230906082721686
image-20230906082721686
image-20230906082928336
image-20230906082928336
image-20230906083131743
image-20230906083131743

2.26 创建发布任务

image-20230906084008569
image-20230906084008569
image-20230906084028296
image-20230906084028296

打包跳过test:

image-20241026090513406
image-20241026090513406

post-steps选择:Send files or execute commands over SSH

image-20230906092150144
image-20230906092150144

点击build now开始部署

image-20230906094022851
image-20230906094022851
image-20230906094108329
image-20230906094108329