Linux-Learning
更新: 2025/4/9 字数: 0 字 时长: 0 分钟
一、使用场景和简介



(1)Linux系统版本

①发行版

二、Linux安装

(1)VMware安装
Vmware-17(提取码: ak47):VMware-workstation-full-17.5.0-22583795 (1).exe
(2)Centos镜像
阿里云镜像地址:centos-7-isos-x86_64安装包下载_开源镜像站-阿里云 (aliyun.com)
(3)Finalshell安装
(4)VMware-新建虚拟机
①新建虚拟机








②Linux配置


**安装过程中,发现不少问题。**如下图
1)网络和主机名

首先,我们点击网络和主机名,进去打开网络。

再点击左上角的完成,退出来可以看到,网络问题已经解决了。
2)安装目的地
然后点击 安装目的地,
直接点击右上角完成,回到配置页面,可以看到,这个也解决了。

3)设置Root密码
点击 root 根密码
设置跟密, 然后点击两次 完成,解决了。


4)设置时区
时区为 美洲,我们点开,设置为上海。

时区也配置好了。
5)安装配置
如果使用本地的ISO映像仍然报错,可以考虑切换不同版本的Centos映像,也可以通过输入阿里云镜像网址的方式,在线安装。
阿里云Centos下载地址:阿里云Centos下载地址
阿里云Centos镜像站:阿里云Centos镜像站

③登录Linux
默认用户名为root,密码为前面设置的root密码

④网卡配置
如果之前在Linux配置中已经开启了“网络和主机名”的网络开关,则可以直接使用命令:ip addr,查看IP地址。



vi /etc/sysconfig/network-scripts/ifcfg-ens33报错
解决 Linux 网络 “Job for network.service failed because the control process exite”问题
解决方案
1、和 NetworkManager 服务有冲突,直接关闭 NetworkManger 服务就好了,
shellservice NetworkManager stop禁止开机启动
shellchkconfig NetworkManager off重启网络
shellservice network restart
配置完成后: 
⑤配置完成

三、FinalShell远程连接Linux服务器
(1)安装
(2)远程连接Linux服务器


(3)操作Linux服务器

四、Linux目录
(1)Linux和Windows目录结构对比

(2)目录介绍

- bin存放二进制可执行文件
- boot存放系统引导时使用的各种文件
- dev存放设备文件
- etc存放系统配置文件
- home存放系统用户的文件
- lib存放程序运行所需的共享库和内核模块
- opt额外安装的可选应用程序包所放置的位置
- root超级用户目录
- sbin存放二进制可执行文件,只有root用户才能访问
- tmp存放临时文件
- usr存放系统应用程序
- var存放运行时需要改变数据的文件,例如日志文件
五、Linux常用命令
1、Linux命令初体验


(1)ls-查看当前目录下的内容
①ls -l 或者 ll(两个L)
表示查看当前目录下的详细内容
ls -l
ll(2)pwd-查看当前所在目录
(3)cd [目录名] -切换目录
(4)touch [文件名] -如果文件不存在,新建文件
(5)mkdir [目录名] -创建目录
(6)rm [文件名|目录名] -删除指定文件或目录
①rm -f [文件名1] [文件名2]
rm -f a.txt b.txt #强制删除多个文件(-f,表示不提示,直接删除)(5)echo 内容 >> filename-追加内容

2、Linux命令使用技巧

3、Linux命令格式
command [-options] [parameter]

- command:命令名
- [-options]:选项,可用来对命令进行控制,也可以省略
- [parameter]:传给命令的参数,可以是零个、一个或者多个

4、文件目录操作命令
(1)ls -显示指定目录下的内容
作用:显示指定目录下的内容语法:ls [-al] [dir]说明:
- -a显示所有文件及目录(.开头的隐藏文件也会列出)
- -L除文件名称外,同时将文件型态(d表示目录,-表示文件)、权限、拥有者、文件大小等信息详细列出
注意:由于我们使用ls命令时经常需要加入-L选项,所以Linux为ls-l命令提供了一种简写方式,即ll
(2)cd -用于切换目录

作用:用于切换当前工作目录,即进入指定目录语法:cd [dirName]
特殊说明:
~表示用户的home目录(一个用户可以有多个用户目录)
.表示目前所在的目录
..表示目前目录位置的上级目录
举例:cd .. 切换到当前目录的上级目录cd ~ 切换到用户的home目录cd /usr /local 切换到/usr/local目录
(3)cat-用于显示文件内容

作用:用于显示文件内容语法:cat[-n] fileName
说明:
- -n:由1开始对所有输出的行数编号
举例:
- cat /etc/profile 查看/etc目录下的profile文件内容
(4)more-已分页的形式显示文件内容

作用:以分页的形式显示文件内容语法:morefileName
操作说明:
- 回车键 向下滚动一行
- 空格键 向下滚动一屏
- b 返回上一屏
- q或者Ctrl+c 退出more
举例:more/etc/profile 以分页方式显示/etc目录下的profile文件内容
(5)tail-查看文件末尾的内容

作用:查看文件末尾的内容
语法:tail[-f] fileName
说明:
- -f:动态读取文件末尾内容并显示,通常用于日志文件的内容输出
举例:
- tail /etc/profile 显示/etc目录下的profile文件末尾10行的内容
- tail-20/etc/profile 显示/etc目录下的profile文件末尾20行的内容
- tail -f /itcast/my.log 动态读取/itcast目录下的my.log文件末尾内容并显示

(6)mkdir-创建目录

作用:创建目录
语法: mkdir [-p] dirName
说明:
●-p:确保目录名称存在,不存在的就创建一个。通过此选项,可以实现多层目录同时创建
举例:
- mkdiritcast在当前目录下,建立一个名为itcast的子目录
- mkdi r-p itcast/test在工作目录下的itcast目录中建立一个名为test的子目录,若itcast目录不存在,则建立一个
(7)rmdir-删除空目录

作用:删除空目录
语法:rmdir [-p] dirName
说明:
- -p:当子目录被删除后使父目录为空目录的话,则一并删除
举例:
- rmdir itcast删除名为itcast的空目录
- rmdir -p itcast/test删除itcast目录中名为test的子目录,若test目录删除后itcast目录变为空目录,则也被删除
- rmdir ==itcast== 删除名称以itcast开始的空目录*
(8)rm-删除文件或者目录

作用:删除文件或者目录
语法:rm [-rf] name
说明:
- -r:将目录及目录中所有文件(目录)逐一删除,即递归删除
- -f:无需确认,直接删除
举例:
- rm -r itcast/删除名为itcast的目录和目录中所有文件,删除前需确认
- rm -rf itcast/无需确认,直接删除名为itcast的目录和目录中所有文件
- rm -f hello.txt无需确认,直接删除hello.txt文件
5、拷贝移动命令
(1)cp-用于复制文件或目录

作用:用于复制文件或目录
语法:cp [-r] source dest
说明:
- -r:如果复制的是目录需要使用此选项,此时将复制该目录下所有的子目录和文件
举例:
- cp hello.txt itcast/ 将hello.txt复制到itcast目录中
- cp hello.txt ./hi.txt 将hello.txt复制到当前目录,并改名为hi.txt(==./==表示当前目录)
- cp -r itcast/ ./itheima/ 将itcast目录和目录下所有文件复制到itheima目录下
- cp -r itcast/* ./itheima/ 将itcast目录下所有文件复制到itheima目录下(只复制所有文件)
(2)mv-为文件或目录改名、或将文件或目录移动到其他位置

作用:为文件或目录改名、或将文件或目录移动到其它位置
语法:mv source dest
举例:
- mv hello.txt hi.txt 将hello.txt改名为hi.txt
- mv hi.txt itheima==/== 将文件hi.txt移动到itheima目录中
- mv hi.txt itheima/hello.txt 将hi.txt移动到itheima目录中,并改名为hello.txt
- mv itcast/ itheima/ 如果itheima目录不存在,将itcast目录改名为itheima
- mv itcast/ itheima/ 如果itheima目录存在,将itcast目录移动到itheima目录中
6、打包压缩命令 tar

(1)tar基础命令
作用:对文件进行打包、解包、压缩、解压
语法:tar [-zcxvf] fileName [files]
tar [-zcxvf] fileName(打/解包后的文件名带上后缀) [files(目标文件或目录)]
- 包文件后缀为==.tar表示只是完成了打包==,并没有压缩
- 包文件后缀为==.tar.gz表示打包的同时还进行了压缩==
说明:
- -z:z代表的是gzip,通过gzip命令处理文件,gzip可以对文件压缩或者解压
- -c:c代表的是create,即创建新的包文件 (打包)
- -x:x代表的是extract,实现从包文件中还原文件 (解包)
- -v: v代表的是verbose,显示命令的执行过程
- -f:f代表的是file,用于指定包文件的名称
(2)案例

举例:
- -czvf:表示对文件打包并压缩(并展示命令执行过程、指定打包后的包文件名称),tar -czvf test/newFile.tar.gz itcast,将itcast文件(目录)打包到test目录下,并为打包后的包文件指定名称(后缀为.tar.gz)
- -cvf: 表示对文件打包(并展示命令执行过程、指定打包后的包文件名称),tar -cvf newName.tar itcast
- -xvf: 表示对包文件进行解包, tar -xvf test.tar
- -xzvf: 表示对包文件进行解包并解压,tar -xzvf example.tar.gz
- -C:表示指定解压后的文件所在目录,tar -zxvf hello.tar.gz -C /usr/local
(3)解压缩到指定目录
解包并解压文件(目录)到指定目录,并更改解压后的名字
①法一:-C,
-C:表示指定解压后的文件所在目录,tar -zxvf hello.tar.gz -C /usr/local
- tar -xzvf newFile.tar.gz -C ./004 --transform 's/itcast/黑马目录/'
②法二:--directory
- tar -xzvf newFile.tar.gz --directory /指定目录 --transform '==s/==旧文件名/新文件名/'
假设你有一个压缩文件 example.tar.gz,其中包含一个文件 file1.txt,你希望将 file1.txt 解压缩到 /home/user/target_directory/ 目录,并且将解压缩后的文件重命名为 newfile.txt。你可以使用以下步骤:
解压缩到指定目录,并重命名文件:
bashtar -xzvf example.tar.gz --directory /home/user/target_directory/ --transform 's/file1.txt/newfile.txt/'解释:
-x:表示解压缩。-z:表示解压缩.gz格式的文件。-v:表示在解压缩过程中显示详细信息。-f:表示指定要操作的文件。--directory /home/user/target_directory/:指定解压缩的目标目录。--transform 's/file1.txt/newfile.txt/':用来修改解压缩后的文件名,其中file1.txt是压缩包中的原文件名,newfile.txt是解压缩后的新文件名。
结果:
经过上述命令后,
file1.txt将被解压缩到/home/user/target_directory/目录,并且文件名会被修改为newfile.txt。
如果压缩包中有多个文件或目录,你可以使用正则表达式来处理更多文件的重命名。根据需要调整 --transform 参数中的规则。
7、文本编辑命令 vi/vim
(1)Vim的安装

作用:vi命令是Linux系统提供的一个文本编辑工具,可以对文件内容进行编辑,类似于Windows中的记事本
语法:vi fileName
说明:
- 1、vim是从vi发展来的一个功能更加强大的文本编辑工具,在编辑文件时可以对文本内容进行着色,方便我们对文件进行编辑处理,所以实际工作中vim更加常用。
- 2、要使用vim命令,需要我们自己完成安装。可以使用下面的命令来完成安装:yum install vim
(1)yum命令错误
CentOS7执行yum命令遇到“Could not resolve host: mirrorlist.centos.org; 未知的错误”如何解决
原因是国内网络不能访问外网。所以需要将mirrorlist.centos.org替换为国内可以访问的镜像源。
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo然后再清除yum缓存
yum clean all然后重新生成缓存
yum makecache(2)Vim的编辑模式

说明:
- 1、在使用vim命令编辑文件时,如果指定的文件存在则直接打开此文件。如果指定的文件不存在则新建文件。
- 2、vim在进行文本编辑时共分为三种模式,分别是命令模式(Command mode),插入模式(Insert mode)和底行模式(Lastlinemode)。这三种模式之间可以相互切换。我们在使用vim时一定要注意我们当前所处的是哪种模式。
①命令模式

- 命令模式下可以查看文件内容、移动光标(上下左右箭头、gg、G)
- gg,快速回到文件开头
- G,快速回到文件末尾
- 通过vim命令打开文件后,默认进入命令模式
- 另外两种模式需要首先进入命令模式,才能进入彼此,即必须通过命令模式进行转换其他两种模式
②插入模式-使用i

- 插入模式下可以对文件内容进行编辑
- 在命令模式下按下==[i,a,o]任意一个,可以进入插入模式。进入插入模式后,下方会出现【insert】==字样
- 在插入模式下按下ESC键,回到命令模式,
- 通过命令模式在进入底行模式,在底行模式中进行保存或退出
③底行模式-使用==:==

- 底行模式下可以通过命令对文件内容进行查找、显示行号、退出等操作
- 在命令模式下按下[: 和 /]任意一个,可以进入底行模式
- 通过==/方式进入底行模式后,可以对文件内容进行查找==
- 通过==:方式进入底行模式后,可以输入wq(保存并退出)==、q!(不保存退出)、Set nu(显示行号)
8、查找命令 find、grep
(1)find-查找文件

作用:在指定目录下查找文件
语法:find dirName -option fileName
举例:
- find . -name "*.java" (其中 . 表示在当前目录下寻找 ) ,在当前目录及其子目录下查找.java结尾文件
- find /itcast -name "*.java" 在/itcast目录及其子目录下查找.java结尾的文件
(2)grep-查找指定文件中的内容

作用:从指定文件中查找指定的文本内容
语法:grep word fileName
举例:
- grep Hello HelloWorld.java 查找HelloWorld.java文件中出现的Hello字符串的位置
- *grep hello .java 查找当前目录中所有==.java结尾==的文件中包含hello字符串的位置
9、Linux-进程
(1)查看进程命令-ps

查看进程 ps -ef | grep [进程名称]
注意:
- ps命令是linux下非常强大的进程查看命令,通过ps -ef可以查看当前运行的所有进程的详细信息
- "|”在Linux中称为管道符,可以将前一个命令的结果输出给后一个命令作为输入
- 使用ps命令查看进程时,经常配合管道符和查找命令grep一起使用,来查看特定进程
举例:
- 查看Tomcat的进程:ps-ef| grep tomcat
(2)停止进程-kill
结束Tomcat进程
- 查看Tomcat进程,获得进程id

- 执行命令结束进程kill -9 进程号
注意:
kill命令是Linux提供的用于结束进程的命令,-9表示强制结束
案例-停止Tomcat服务

停止Tomcat服务的方式:
①法一:
运行Tomcat的bin目录中提供的停止服务的脚本文件 shutdown.sh
执行命令:
sh shutdown.sh
./shutdown.sh
②法二:
结束Tomcat进程
- 查看Tomcat进程,获得进程id

- 执行命令结束进程kill -9 进程号
注意:
kill命令是Linux提供的用于结束进程的命令,-9表示强制结束
10、Linux防火墙操作

查看防火墙状态(systemctl status firewalld 或 firewall-cmd --state)
暂时关闭防火墙(systemctl stop firewalld)
永久关闭防火墙(systemctl disable firewalld)
开启防火墙(systemctl start firewalld)
开放指定端口(firewall-cmd --zone=public --add-port=8080/tcp --permanent)
关闭指定端口(firewall-cmd --zone=public --remove-port=8080/tcp --permanent)
立即生效(firewall-cmd --reload),开放或者关闭端口后需要执行立即生效命令
查看开放的端口(firewall-cmd --zone=public --list-ports)
注意:
- 1、Systemctl是管理Linux中服务的命令,可以对服务进行启动、停止、重启、查看状态等操作
- 2、firewall-cmd是Linux中专门用于控制防火墙的命令
- 3、为了保证系统安全,服务器的防火墙不建议关闭,只需开放指定的端口就行,例如Tomcat就可以开发8080端口,Mysql数据库开放3306端口
11、Linux-服务
- systemctl status [服务名]
- systemctl start [服务名]
- systemctl enable mysqld 开机启动mysql服务
- netstat-tunlp 查看已经启动的服务(使用netstat命令,需要提前导入yum install net-tools)
(1)案例-启动mysql服务mysqld

- systemctl status mysqld 查看mysql服务状态
- systemctl start mysqld 启动mysql服务
说明:
可以设置开机时启动mysql服务,避免每次开机启动mysql
- systemctl enable mysqld 开机启动mysql服务
前提:使用netstat命令,需要提前导入yum install net-tools
- netstat-tunlp 查看已经启动的服务
- netstat-tunlp|grep mysql
- ps -ef|grep mysql 查看mysql进程
12、Yum-软件包管理器

13、nohup-挂起进程

改为后台运行SpringBoot程序,并将日志输出到日志文件
目前程序运行的问题
- 线上程序不会采用控制台霸屏的形式运行程序,而是将程序在后台运行
- 线上程序不会将日志输出到控制台,而是输出到日志文件,方便运维查阅信息
nohup命令:英文全称nohangup(不挂起),用于不挂断地运行指定命令,退出终端不会影响程序的运行
语法格式:nohup Command [Arg...] [&]
参数说明:
- Command:要执行的命令
- Arg:一些参数,可以指定输出文件
- &:让命令在后台运行
举例:hello.log为日志文件
nohup java -jar springboot工程.jar &> hello.log &nohup java -jar boot工程.jar &>hello.log& 后台运行java-jar命令,并将日志输出到hello.log文件
六、软件安装
1、软件安装方式

- 二进制发布包安装
- 软件已经针对具体平台编译打包发布,只要解压,修改配置即可
- rpm安装
- 软件已经按照redhat(红帽)的包管理规范进行打包,使用rpm命令进行安装,不能自行解决库依赖问题(无法实现依赖传递)
- yum安装
- 一种在线软件安装方式(需要联网),本质上还是rpm安装,自动下载安装包并安装,安装过程中自动解决库依赖问题
- 源码编译安装
- 软件以源码工程的形式发布,需要自己编译打包
2、使用finalshell快捷上传文件

3、JDK安装

4、Tomcat安装
(1)安装Tomcat

(2)验证Tomcat是否启动成功

(3)防火墙操作

(4)停止Tomcat服务

停止Tomcat服务的方式:
①法一-脚本文件
运行Tomcat的bin目录中提供的停止服务的脚本文件 shutdown.sh
执行命令:
sh shutdown.sh
./shutdown.sh
②法二:结束进程
结束Tomcat进程
- 查看Tomcat进程,获得进程id

- 执行命令结束进程kill -9 进程号
注意
- kill命令是Linux提供的用于结束进程的命令,-9表示强制结束
5、MySQL安装
(1)安装MySQL
①检测当前系统中是否安装MySQL数据库

rpm -qa 查询当前系统中安装的所有软件
rpm -qa| grep mysql 查询当前系统中安装的名称带mysql的软件
rpm -qa| grep mariadb 查询当前系统中安装的名称带mariadb的软件
RPM(Red-HatPackageManager)RPM软件包管理器,是红帽Linux用于管理和安装软件的工具
注意事项
- 如果当前系统中已经安装有MySQL数据库,安装将失败。CentOS7自带mariadb,与MySQL数据库冲突,需要删除mariadb,才能安装Mysql
②卸载已经安装的冲突软件

卸载软件
- rpm -e --nodeps 软件名称
- rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64
③将资料中提供的MySQL安装包上传到Linux并解压

- mkdir /usr/local/mysql
- tar -zxvf mysql-5.7.25-1.el7.x86_64.rpm-bundle.tar.gz -C /usr/local/mysql
④按照顺序安装rpm软件包
root用户用 yum localinstall *.rpm ,一次性安装所有软件包,不需要考虑顺序问题

rpm-ivhmysql-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
rpm -ivh mysql-community-server-5.7.25-1.el7.x86_64.rpm
说明1:安装过程中提示缺少net-tools依赖,使用yum安装
说明2:可以通过指令升级现有软件及系统内核
- yum update
(2)启动MySQL服务

- systemctl status mysqld 查看mysql服务状态
- systemctl start mysqld 启动mysql服务
说明:
可以设置开机时启动mysql服务,避免每次开机启动mysql
- systemctl enable mysqld 开机启动mysql服务
前提:使用netstat命令,需要提前导入yum install net-tools
- netstat-tunlp 查看已经启动的服务
- netstat-tunlp|grepmysql
- ps -ef|grep mysql 查看mysql进程
(3)查阅临时密码

(4)修改密码,开放访问权限

登录MySQL,修改密码,开放访问权限
- mysql -uroot -p 登录mysql(使用临时密码登录)
修改密码
- set global validate_password_length=4; 设置密码长度最低位数
- set global validate_password_policy=LOW; 设置密码安全等级低,便于密码可以修改成root
- set password = password('root'); 设置密码为root
开启访问权限
- shell
grant all on *.* to 'root'@'%' identified by'root'; #允许外部访问mysql flush privileges; (刷新权限)
(5)测试
记得开放防火墙的3306端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent #开发3306端口
firewall-cmd --reload #刷新

6、安装Git


7、安装Maven

tar-zxvfapache-maven-3.5.4-bin.tar.gz-C/usr/local
vim/etc/profile 修改配置文件,加入如下内容
- export MAVEN_HOME=/usr/local/apache-maven-3.5.4
- export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH
- source/etc/profile
mvn -version 查看maven版本
修改配置文件内容如下
**vim /usr/local/apache-maven-3.5.4/conf/settings.xml **
指定Maven以后依赖保存的本地仓库
<localRepository>/usr/local/repo</localRepository> #指定Maven以后依赖保存的本地仓库8、安装Nginx
(1)前言
Nginx是一款卓越的高性能Web服务器,被广泛用于托管网站和应用程序。本文旨在为您提供详细的指南,帮助您在Linux系统上成功安装、配置和启动Nginx服务器。通过这一过程,您将了解如何将Nginx集成到您的系统中,以便轻松地托管您的网站和应用程序。
(2)安装依赖项
在开始安装Nginx之前,首先需要安装一些依赖项,以确保Nginx编译和运行正常。打开终端并执行以下命令:
yum install -y wget gcc-c++ pcre-devel zlib-devel openssl-devel这将安装必要的工具和库,以支持Nginx的编译和运行。
(3)下载Nginx
从Nginx官网下载最新的稳定版本。您可以在https://nginx.org/en/download.html上找到最新版本的下载链接。

# 例如,下载Nginx 1.24.0版本
wget https://nginx.org/download/nginx-1.24.0.tar.gz创建一个文件夹
cd /usr/local
mkdir nginx
cd nginx
解压Nginx
解压下载的Nginx源代码包:
tar -zxvf nginx-1.24.0.tar.gz -C /usr/local/nginx编译和安装
进入解压后的Nginx目录并进行编译和安装:
# 切换到 Nginx 解压目录
cd /usr/local/nginx/nginx-1.24.0
# 编译前的配置和依赖检查,考虑到后续安装ssl证书(https)、http 添加两个模块
./configure --with-http_stub_status_module --with-http_ssl_module
# 编译安装
make && make installNginx安装完成后,默认自动创建 /usr/local/nginx 目录,并创建必要的文件和目录,包括配置文件、日志文件、HTML文件等。

(4) 配置nginx环境变量
vim /etc/profileexport NGINX_HOME=/usr/local/nginx
export PATH=$PATH:$NGINX_HOME/sbin(5)重新加载配置文件
source /etc/profile(6) 启动Nginx
进入Nginx的安装目录:
cd /usr/local/nginx/sbin然后,启动Nginx服务器:
./nginx
您现在可以通过浏览器访问您的服务器的IP地址或域名来验证Nginx是否正常工作。

9、lrzsz 图形化上传文件工具(finallshell已自带)
#使用 rz命令进行图形化的文件上传
(1)使用rz命令进行图形化的文件上传

七、项目部署
1、手工部署-后端
(1)在IDEA中开发SpringBoot项目并打成jar包

(2)将jar包上传到Linux服务器

(3)启动SpringBoot程序

(4)检查防火墙,确保8080端口对外开放,访问SpringBoot项目

(5)改为后台运行SpringBoot程序,并将日志输出到日志文件

改为后台运行SpringBoot程序,并将日志输出到日志文件
目前程序运行的问题
- 线上程序不会采用控制台霸屏的形式运行程序,而是将程序在后台运行
- 线上程序不会将日志输出到控制台,而是输出到日志文件,方便运维查阅信息
nohup命令:英文全称nohangup(不挂起),用于不挂断地运行指定命令,退出终端不会影响程序的运行
语法格式:nohup Command [Arg...] [&]
参数说明:
- Command:要执行的命令
- Arg:一些参数,可以指定输出文件
- &:让命令在后台运行
举例:hello.log为日志文件
nohupjava -jar springboot工程.jar &> hello.log &nohupjava -jar boot工程.jar &>hello.log& 后台运行java-jar命令,并将日志输出到hello.log文件
(6)停止SpringBoot程序

2、Shell脚本自动部署-后端

(1)安装Git


(2)安装Maven

tar-zxvfapache-maven-3.5.4-bin.tar.gz-C/usr/local
vim/etc/profile 修改配置文件,加入如下内容
- export MAVEN_HOME=/usr/local/apache-maven-3.5.4
- export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH
- source/etc/profile
mvn -version 查看maven版本
修改配置文件内容如下
**vim /usr/local/apache-maven-3.5.4/conf/settings.xml **
指定Maven以后依赖保存的本地仓库
<localRepository>/usr/local/repo</localRepository> #指定Maven以后依赖保存的本地仓库(3)编写Shell脚本(拉取代码、编译、打包、启动)
在/usr/local/sh目录下, 将shell脚本文件加入到该目录中

shell脚本(需要根据自己的项目,自定义配置)
- APP_NAME
- 存放Git拉取后的项目位置,cd /usr/local/helloworld
- 启动项目的jar包和存放实时日志文件的位置即文件名,nohup java -jar helloworld-1.0-SNAPSHOT.jar &> helloworld.log &
#!/bin/sh
echo =================================
echo 自动化部署脚本启动
echo =================================
echo 停止原来运行中的工程
APP_NAME=helloworld
tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
echo 'Stop Process...'
kill -15 $tpid
fi
sleep 2
tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
echo 'Kill Process!'
kill -9 $tpid
else
echo 'Stop Success!'
fi
echo 准备从Git仓库拉取最新代码
cd /usr/local/helloworld
echo 开始从Git仓库拉取最新代码
git pull
echo 代码拉取完成
echo 开始打包
output=`mvn clean package -Dmaven.test.skip=true`
cd target
echo 启动项目
nohup java -jar helloworld-1.0-SNAPSHOT.jar &> helloworld.log &
echo 项目启动完成可以遇到的问题:
$'\r': 未找到命令:这通常是因为脚本文件中包含了 Windows 风格的换行符(CRLF)而不是 Unix 风格的换行符(LF)。Unix 系统要求换行符为 LF,而 Windows 使用 CRLF。如果脚本是从 Windows 环境中复制或编辑的,可能会出现这个问题。- 如果你的系统没有安装
dos2unix,你可以用sed命令来修复:
sed -i 's/\r$//' sky-take-out.sh- 如果你的系统没有安装
语法错误: 未预期的文件结尾:这可能是因为文件末尾的换行符问题,或者脚本文件中有其他格式问题导致的。也有可能是因为有一些未闭合的结构,比如if语句没有正确结束。- 确保脚本中的每个
if、for、while语句都有正确的结束标记。例如,确保if语句后面有fi。
- 确保脚本中的每个
(4)为用户授予执行Shell脚本的权限
①文件权限

chmod(英文全拼:changemode)命令是控制用户对文件的权限的命令
- Linux中的权限分为:读(r)、写(w)、执行(x)三种权限
- Linux的文件调用权限分为三级:文件所有者(Owner)、用户组(Group)、其它用户(OtherUsers)
- 只有文件的==所有者和超级用户(root)==可以修改文件或目录的权限
- 要执行ShelL脚本需要有对此脚本文件的执行权限,如果没有则不能执行
①为用户授权

除了第一位使用==-或者d来区分该文件时目录还是文件==
将之后的九位数,划分为三组,通过0~7(000~111)的八进制数来代表授予每组的权限
注意:三位数字分别代表不同用户的权限
- 第1位表示文件拥有者的权限
- 第2位表示同组用户的权限
- 第3位表示其他用户的权限


(5)执行Shell脚本

(6)设置静态ip
为了防止每次重新启动虚拟机,让ip地址发生变化,导致网站的ip地址不确定,需要设置虚拟机的ip为静态ip
①设置静态ip
vim /etc/sysconfig/network-scripts/ifcfg-ens33
注意:修改后的静态ip、网关、DNS服务器的网段需要和此处保持一致,即192.168.138.xx
BOOTPROTO="static" #使用静态IP地址,默认为dhcp
IPADDR="192.168.138.100" #设置的静态IP地址
NETMASK="255.255.255.0" #子网掩码
GATEWAY="192.168.138.2" #网关地址
DNS1="8.8.8.8" #DNS服务器②重启网络服务
systemctl restart network注意:重启完网络服务后ip地址已经发生了改变,此时FinalShell已经连接不上Linux系统,需要创建一个新连接才能连接到Linux。

3、部署架构-前后端,客户端、主从数据库、Redis


(1)安装/配置/启停 Nginx
① 前言
Nginx是一款卓越的高性能Web服务器,被广泛用于托管网站和应用程序。本文旨在为您提供详细的指南,帮助您在Linux系统上成功安装、配置和启动Nginx服务器。通过这一过程,您将了解如何将Nginx集成到您的系统中,以便轻松地托管您的网站和应用程序。
② 安装依赖项
在开始安装Nginx之前,首先需要安装一些依赖项,以确保Nginx编译和运行正常。打开终端并执行以下命令:
yum install -y wget gcc-c++ pcre-devel zlib-devel openssl-devel这将安装必要的工具和库,以支持Nginx的编译和运行。
③下载Nginx
从Nginx官网下载最新的稳定版本。您可以在https://nginx.org/en/download.html上找到最新版本的下载链接。

# 例如,下载Nginx 1.24.0版本
wget https://nginx.org/download/nginx-1.24.0.tar.gz创建一个文件夹
cd /usr/local
mkdir nginx
cd nginx
解压Nginx
解压下载的Nginx源代码包:
tar -zxvf nginx-1.24.0.tar.gz -C /usr/local/nginx编译和安装
进入解压后的Nginx目录并进行编译和安装:
# 切换到 Nginx 解压目录
cd /usr/local/nginx/nginx-1.24.0
# 编译前的配置和依赖检查,考虑到后续安装ssl证书(https)、http 添加两个模块
./configure --with-http_stub_status_module --with-http_ssl_module
# 编译安装
make && make installNginx安装完成后,默认自动创建 /usr/local/nginx 目录,并创建必要的文件和目录,包括配置文件、日志文件、HTML文件等。

④ 配置nginx环境变量
vim /etc/profileexport NGINX_HOME=/usr/local/nginx
export PATH=$PATH:$NGINX_HOME/sbin⑤ 重新加载配置文件
source /etc/profile⑥ 启动Nginx
进入Nginx的安装目录:
cd /usr/local/nginx/sbin然后,启动Nginx服务器:
./nginx
您现在可以通过浏览器访问您的服务器的IP地址或域名来验证Nginx是否正常工作。

配置nginx.conf=>打开配置文件

vi /usr/local/nginx/conf/nginx.conf将端口号改成8089(随便挑个端口),因为可能apeache占用80端口,apeache端口尽量不要修改,我们选择修改nginx端口。
将localhost修改为你服务器的公网ip地址。

nginx.conf
#user nobody; #指定 Nginx 进程以哪个用户的身份运行,通常会设置为非特权用户以增强安全性。被注释掉了,默认运行用户可能是 nginx 或 www-data。
worker_processes 1; #指定 Nginx 使用的工作进程数量。一般根据 CPU 核心数设置,1 是最基本的配置。
#error_log logs/error.log; #指定错误日志文件的位置和日志级别。被注释掉了,默认的错误日志级别和位置会被使用。
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid; #指定 Nginx 进程 ID 文件的位置。被注释掉了,默认位置可能是 /var/run/nginx.pid。
events {
worker_connections 1024; #每个工作进程最大可以打开的连接数。设置为 1024,这意味着 Nginx 可以同时处理最多 1024 个连接。
}
http {
include mime.types; #包含 MIME 类型配置文件,以便为响应设置适当的 Content-Type。
default_type application/octet-stream; #设置默认 MIME 类型为 application/octet-stream,通常用于未指定类型的文件。
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on; #启用高效的文件传输。
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65; #设置客户端与服务器之间的持久连接超时时间为 65 秒。
#gzip on;
map $http_upgrade $connection_upgrade{ #配置 WebSocket 连接的升级机制。
default upgrade;
'' close;
}
#使用upstream指令配置后端服务器组
upstream webservers{ #定义了一个名为 webservers 的负载均衡后端服务器组
#负载均衡
#本地后端,8080端口
#server 127.0.0.1:8080 weight=90 ;
#Linux部署后端
server 192.168.88.129:9090 weight=90 ;
#本地后端,9090端口
#server 127.0.0.1:9090 weight=90 ;
#server 127.0.0.1:8088 weight=10 ;
}
server {
listen 80; #监听 80 端口的 HTTP 请求
server_name localhost; #指定外部访问的服务器名称为 localhost。
#charset koi8-r;
#access_log logs/host.access.log main;
location / { #根路径配置,将请求的根路径指向 html/dist 目录,默认首页是 index.html 和 index.htm。
root html/dist;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# 反向代理,处理管理端发送的请求
location /api/ { #反向代理到 http://webservers/admin/
#rewrite ^/api/(.*)$ /$1 break; #请求 /api/data 会被前端代理重写为 /data,然后在 Nginx 层直接转发到 http://webservers/admin/data。
proxy_pass http://webservers/admin/;
#proxy_pass http://webservers/admin/;
}
# 反向代理,处理用户端发送的请求
location /user/ { #反向代理到 http://webservers/user/
proxy_pass http://webservers/user/;
}
# WebSocket
location /ws/ { #处理 WebSocket 连接,设置 proxy_http_version 1.1 和其他 WebSocket 特定的头部。
proxy_pass http://webservers/ws/;
proxy_http_version 1.1;
proxy_read_timeout 3600s;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "$connection_upgrade";
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}⑦ 停止Nginx
#寻找Nginx进程
ps -ef | grep nginx
#杀死Nginx进程
kill -9 78879⑧ 防火墙设置
如果您的系统启用了防火墙,需要关闭防火墙或者**开发相应的端口**
# 查看防火墙状态
systemctl status firewalld
# 关闭防火墙
systemctl stop firewalld
# 开机禁用防火墙
systemctl disable firewalld
#开放Nginx的80端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload #开放或者关闭端口后==需要执行立即生效命令
firewall-cmd --zone=public --list-ports #查看开放的端口(2)前端-Nginx部署
①前端打包成dist
终端输入,打包获得dist目录文件
npm run build

上传到服务端

②WebSocket请求路径错误
VUE_APP_SOCKET_URL = 'ws://192.168.88.130:80'
这里是WebSocket的地址,Nginx会反向代理到后端,需要注意的是,这里的url不能写为ws://192.168.88.129:9090/ws/,否则会导致WebSocket连接失败,需要在使用的时候再去拼接'/ws/',

# Base api
VUE_APP_BASE_API = '/api'
# 统一前缀,'/api' http://localhost:8080/api
NODE_ENV = 'development'
VUE_APP_NODE_ENV = 'dev'
//后端服务的地址
#VUE_APP_URL = 'http://localhost:8080/admin'
VUE_APP_URL = 'http://192.168.88.129:9090/admin'
#VUE_APP_SOCKET_URL = 'ws://localhost:8080/ws/'
VUE_APP_SOCKET_URL = 'ws://192.168.88.130:80' #这里是WebSocket的地址,Nginx会反向代理到后端,
#需要注意的是,这里的url不能写为ws://192.168.88.129:9090/ws/,否则会导致WebSocket连接失败,需要在使用的时候再去拼接'/ws/',
//VUE_APP_SOCKET_URL = 'ws://http://23ce4dbd.cpolar.cn/ws/'
VUE_CLI_BABEL_TRANSPILE_MODULES = true
# 删除权限 true/有
VUE_APP_DELETE_PERMISSIONS = true八、(MySQL的主从复制)数据库的读写分离
1、介绍

MySQL主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的二进制日志功能。就是一台或多台MySQL数据库(slave,即从库)从另一台MySQL数据库(master,即主库)进行日志的复制然后再解析日志并应用到自身,最终实现从库的数据和主库的数据保持一致。MySQL主从复制是MySQL数据库自带功能,无需借助第三方工具。
MySQL复制过程分成三步:
- master将改变记录到二进制日志(binarylog)
- slave将master的binarylog拷贝到它的中继日志(relaylog)
- 通过开启I/O thread 线程从master主库中读取binlog,在写入slave从库的中继日志relaylog。
- 在从库中在通过SQL thread线程解析日志,执行和主库一样的sql操作
- slave重做中继日志中的事件,将改变应用到自己的数据库中
2、配置
(1)前置条件

①解决 VMware 克隆linux 网卡UUID重复问题
2019年04月06日 系统版本:CentOS Linux release 7.6.1810
参考文档
https://www.cnblogs.com/wayneliu007/p/10388417.html
当我们使用 VMware 克隆 linux 主机时会发生克隆主机和原主机网卡 UUID 重复的问题,这样会对网络通信产生影响。 只要保证每台主机的 UUID 独一无二即可,即为新的主机绑定新的 UUID。
- 生成随机uuid号
# uuidgen
46269697-0bd5-4088-af92-337325daea9e- 替换UUID值
# vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPV6_PRIVACY=no
IPADDR=192.168.0.11
PREFIX=24
GATEWAY=192.168.0.1
DNS1=192.168.0.1
DNS2=114.114.114.114
UUID=46269697-0bd5-4088-af92-337325daea9e- 重启网络服务
# systemctl restart network- 验证查看
此时新主机的网卡UUID值设置完毕,可以通过 nmcli 命令查看 查看网卡 UUID值
# nmcli connection show
NAME UUID TYPE DEVICE
ens33 46269697-0bd5-4088-af92-337325daea9e ethernet ens33查看网卡 MAC
# nmcli device show ens33
GENERAL.DEVICE: ens33
GENERAL.TYPE: ethernet
GENERAL.HWADDR: 00:0C:29:BD:FC:FA
GENERAL.MTU: 1500
GENERAL.STATE: 100 (连接的)
GENERAL.CONNECTION: ens33
GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveConnection/3
WIRED-PROPERTIES.CARRIER: 开
IP4.ADDRESS[1]: 192.168.0.11/24
IP4.GATEWAY: 192.168.0.1
IP4.ROUTE[1]: dst = 192.168.0.0/24, nh = 0.0.0.0, mt = 100
IP4.ROUTE[2]: dst = 0.0.0.0/0, nh = 192.168.0.1, mt = 100
IP4.DNS[1]: 192.168.0.1
IP4.DNS[2]: 114.114.114.114
IP6.ADDRESS[1]: fe80::f5fc:c628:ab36:49a1/64
IP6.GATEWAY: --
IP6.ROUTE[1]: dst = fe80::/64, nh = ::, mt = 100
IP6.ROUTE[2]: dst = ff00::/8, nh = ::, mt = 256, table=255(2)主库-Master
find / -name "my.cnf"log-bin=mysql-bin #[必须]启用二进制日志
server-id=100 #[必须]服务器唯一IDsystemctl restart mysqld


GRANT REPLICATION SLAVE ON *.* to'xiaopeng'@'%'identified by'123456';
#报错就分开执行
CREATE USER 'xiaopeng'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'xiaopeng'@'%';注:上面SQL的作用是创建一个用户xiaoming,密码为Root@123456,并且给xia0ming用户授予**REPLICATION SLAVE权限。常用于建立复制时所需要用到的用户权限,也就是slave必须被master授权,成为具有该权限的用户,才能通过该用户复制**。

由于主库的二进制日志文件和位置,会因为操作数据库发生变化,后续在从库中需要使用;
show master status; #由于主库的二进制日志文件和位置,会因为操作数据库发生变化,后续在从库中需要使用;(3)从库-Slave


find / -name "my.cnf"server-id=101 #[必须]服务器唯一IDsystemctl restart mysqld
change master to master_host='192.168.138.100',master_user='xiaopeng',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=439;start slave;注意


show slave status\G(4)注意事项
①在从库中使用 show slave status; 时报错
主从复制报错Fatal error:The slave I/O thread stops because master and slave have equal MySQL server UUIDs;




