3.Linux环境中的项目部署
[Linux基础]-Linux环境中的项目部署
[TOC]
1.Shell与安装
【1】yum
🔖基本概念
yum基本概念
yum( Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器
它是一个类似于开发工具idea、eclipse中的在线插件安装商店
yum [options] [command] [package ...]
# 执行权限:管理员
- options:可选,选项包括-h(帮助),-y(当安装过程提示选择全部为"yes"),-q(不显示安装的过程)等
- command:要进行的操作
- package:操作的对象
yum常用指令
- 列出所有可更新的软件清单命令:
yum check-update
- 更新所有软件命令:
yum update
- 仅安装指定的软件命令:
yum install <package_name>
- 仅更新指定的软件命令:
yum update <package_name>
- 列出所有可安裝的软件清单命令:
yum list
- 删除软件包命令:
yum remove <package_name>
- 查找软件包 命令:
yum search <keyword>
- 清除缓存命令:
yum clean packages
: 清除缓存目录下的软件包yum clean headers
: 清除缓存目录下的 headersyum clean oldheaders
: 清除缓存目录下旧的 headersyum clean, yum clean all (= yum clean packages; yum clean oldheaders)
:清除缓存目录下的软件包及旧的headers
📌操作示例
安装示例:tree(树状展示文件信息)
# 安装tree(需联网操作)
yum -y install tree
# 安装完成,执行tree指令查看效果
tree
# 移除tree(移除成功后再次执行tree则提示指令不存在)
yum remove tree
借助yum检索指定安装包
# 找出以tom开头的安装包列表
yum list tom*
📌yum源
yum的下载依托于yum源(即yum库),yum默认使用的是CentOS的yum源,有时候考虑网络因素,可通过切换不同的yum源改善,例如阿里、网易、搜狐
【2】rpm
🔖基本概念
RPM包管理类似于windows下的“添加/删除程序”
rpm(redhat package manager) 原本是 Red Hat Linux 发行版专门用来管理 Linux 各项套件的程序,由于它遵循 GPL 规则且功能强大方便,因而广受欢迎。逐渐受到其他发行版的采用。RPM 套件管理方式的出现,让 Linux 易于安装,升级,间接提升了 Linux 的适用度
rpm VS yum
rpm只能安装已经下载到本地机器上的rpm包
yum能在线下载并安装rpm包,能更新系统,且还能自动处理包与包之间的依赖问题,
# 安装rpm软件包
rpm -ivh 软件全包名
# 卸载rpm软件包
rpm -e 软件全包名
# 列出所有安装过的包
rpm -qa
# 查询软件包信息
rpm -qi 软件全包名
# 查看文件安装位置
rpm -ql 软件全包名
【3】shell
🔖基本概念
❓shell是什么?
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。shell脚本类似于Windows中编写的批处理文件,它的扩展名是.bat,而在Linux中,shell脚本编写的文件是以.sh结尾的。
以启动tomcat为例,windows下使用的是startup.bat,linux下使用的是startup.sh
❓shell解释器
和java类似(java需要虚拟机解释器),shell也依托于能够编写代码的文本编辑器和解释执行的脚本解释器
# 查看解释器
cat /etc/shells
# 显示结果
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
Linux的Shell常见种类说明如下:
- Bourne Shell(/usr/bin/sh或/bin/sh)
- Bourne Again Shell(/bin/bash)
- C Shell(/usr/bin/csh)
- K Shell(/usr/bin/ksh)
- Shell for Root(/sbin/sh)
📌样例参考
需求说明
自定义一个sh脚本,输出"hello linux"
步骤说明
1.创建hello.sh脚本并填充文本内容
- 【vim hello.sh】
- echo "hello linux",填充完成esc+wq完成文本内容保存
2.查看hello.sh权限,并为其设定执行权限
- 通过【ls -l】指令查看脚本权限(-rw-r--r--),默认无执行权限
- 执行指令【chmod +x ./hello.sh】,再次查看权限(-rwxr-xr-x)
3.借助bash执行hello.sh文件
- 执行指令【./hello.sh】,则可查看到语句正常输出到窗口
📌Shell语法
(1)注释
单行注释
# 注释内容
多行注释
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
# EOF也可用'或者!替代
:<<'
注释内容...
注释内容...
注释内容...
'
:<<!
注释内容...
注释内容...
注释内容...
!
(2)变量
变量定义
基础变量
变量名和等号之间不能有空格⚡。且变量名的命名须遵循如下规则:
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头
- 中间不能有空格,可以使用下划线(_)
- 不能使用标点符号
- 不能使用bash里的关键字(可用help命令查看保留关键字)
# 定义变量var_name
var_name="hello linux"
# 获取变量(变量的花括号是可选的,但一般为了帮助解释器更好地识别变量边界、遵循规范,建议使用花括号进行区分)
echo $var_name
echo ${var_name}
# 已被定义的变量可重新定义
var_name="change"
echo ${var_name}
只读变量:readonly
myProp="hello linux"
# 设置myProp变量为只读变量
readonly myProp
# 上述语句设定myProp变量为只读变量,因此当尝试对myProp进行修改则会提示错误
myProp="test change"
删除变量:unset
myProp="hello linux"
# 删除myProp变量
unset myProp
# 上述语句已删除myProp变量,因此当尝试使用myProp变量无法获取到任何内容
echo ${myProp}
Shell字符串
字符串是shell编程中最常用也是最有用的数据类型,字符串可以用单引号,也可以用双引号,也可以不用引号
单引号
# 字符串定义:单引号
my_str='test string'
单引号字符串的限制:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用
双引号
# 字符串定义:双引号
str='linux'
res="hello, \"$str\"! \n"
echo -e $res
# 输出结果
hello,linux!
双引号的优点:
- 双引号里可以有变量
- 双引号里可以出现转义字符
字符串属性获取
str="hello"
# 获取字符串长度(输出字符串长度)
echo ${#str}
# 提取字符串(下标从0开始计数),从第2个字符开始截取3个字符
echo ${str:1:3}
数组定义
数组定义
bash支持一维数组(不支持多维数组),并且没有限定数组的大小
# 数组定义语法
数组名=(值1 值2 ... 值n)
array_name=(value0 value1 value2 value3)
# 或者换行书写
array_name=(
value0
value1
value2
value3
)
数组处理
# 通过下标设定指定元素(可以使用不连续的下标,下标的范围没有限制)
array_name[0]=xxx
array_name[1]=xxx
# 数组元素读取:${数组名[下标]}
echo ${array_name[n]}
# 使用@可获取数组中所有的元素
echo ${array_name[a]}
# 获取数组元素个数
echo ${#array_name[@]}
echo ${#array_name[*]}
(3)运算符
算数运算符
Shell 和其他编程一样,支持包括:算术、关系、布尔、字符串等运算符
原生 bash **不支持 **简单的数学运算,但是可以通过其他命令来实现,例如expr
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | expr $a + $b 结果为 30 |
- | 减法 | expr $a - $b 结果为 -10 |
* | 乘法 | expr $a \* $b 结果为 200 |
/ | 除法 | expr $b / $a 结果为 2 |
% | 取余 | expr $b % $a 结果为 0 |
= | 赋值 | a=$b 将把变量 b 的值赋给 a |
== | 相等。用于比较两个数字,相同则返回 true。 | [ $a == $b ] 返回 false |
!= | 不相等。用于比较两个数字,不相同则返回 true。 | [ $a != $b ] 返回 true |
条件表达式在定义的时候需要注意,必须要放在方括号之间,且要有空格间隔
参考示例
a=4
b=20
echo “加法运算” `expr $a + $b`
echo “减法运算” `expr $a - $b`
echo “乘法运算(*号前面需反斜杠处理)” ` expr $a \* $b`
echo “除法运算” `expr $b / $a`
((a++))
echo "a = $a"
c=$((a + b))
d=$[a + b]
echo "c = $c"
echo "d = $d"
字符串运算符
下表列出了常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg":
运算符 | 说明 | 举例 |
---|---|---|
= | 检测两个字符串是否相等,相等返回 true | [ $a = $b ] 返回 false |
!= | 检测两个字符串是否相等,不相等返回 true | [ $a != $b ] 返回 true |
-z | 检测字符串长度是否为0,为0返回 true | [ -z $a ] 返回 false |
-n | 检测字符串长度是否为0,不为0返回 true | [ -n "$a" ] 返回 true |
| | 检测字符串是否为空,不为空返回 true | ` |
关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
-eq | 检测两个数是否相等,相等返回 true | [ $a -eq $b ] 返回 false |
-ne | 检测两个数是否不相等,不相等返回 true | [ $a -ne $b ] 返回 true |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true | [ $a -gt $b ] 返回 false |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true | [ $a -lt $b ] 返回 true |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回 true | [ $a -ge $b ] 返回 false |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true | [ $a -le $b ] 返回 true |
布尔运算符
下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
! | 非运算,表达式为 true 则返回 false,否则返回 true | [ ! false ] 返回 true |
-o | 或运算,有一个表达式为 true 则返回 true | [ $a -lt 20 -o $b -gt 100 ] 返回 true |
-a | 与运算,两个表达式都为 true 才返回 true | [ $a -lt 20 -a $b -gt 100 ] 返回 false |
逻辑运算符
假定变量 a 为 10,变量 b 为 20
运算符 | 说明 | 举例 |
---|---|---|
&& | 逻辑的 AND | [[ $a -lt 100 && $b -gt 100 ]] 返回 false |
|| | 逻辑的 OR | [[ $a -lt 100 || $b -gt 100 ]] 返回 true |
(4)流程控制
if语句
if condition
then
command1
command2
...
commandN
fi
# 查找指定进程,如果存在则打印true
if [ $(ps -ef | grep -c "ssh") -gt 1 ];
then
echo "true";
fi
if...else...
if condition
then
command1
command2
...
commandN
else
command
fi
# 查找指定进程,如果存在则打印true,否则打印其他内容
if [ $(ps -ef | grep -c "ssh") -gt 1 ];
then
echo "true";
else
echo "no exist";
fi
if...else-if...else...
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
for循环
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
# 打印集合数据
for loop in A B C D E F G
do
echo "循环输出字母为: $loop"
done
while循环
# 当满足指定条件,执行循环
while condition
do
command
done
case ... esac语句
- )右括号表示分支开始
- ;;两个分号表示分支结束(类似break;)
# case ... esac主要用于分支选择(类似于switch case)
case 值 in
模式1)
command1
command2
command3
;;
模式2)
command1
command2
command3
;;
*)
command1
command2
command3
;;
esac
v="linux"
case "$v" in
"linux") echo "linux学习"
;;
"java") echo "java学习"
;;
"db") echo "数据库"
;;
esac
(5)shell函数
[ function ] funname [()]
{
action;
[return int;]
}
# 说明
- 可以使用function fun() 定义函数,也可以直接fun() 定义,不带任何参数。
- 函数参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
参考样例
test(){
echo "测试函数"
}
echo "-----test函数开始执行-----"
test
echo "-----test函数执行完毕-----"
# 如果函数带有返回值,则其返回结果在该函数调用后通过$?获取
test_return(){
echo "测试函数"
return 1;
}
test_return
echo "函数返回值为 $?"
2.Linux环境中的项目部署
【1】环境部署
a.使用tar.gz压缩包安装软件
(1)使用tar.gz 压缩包安装jdk
步骤1:JDK下载
Jdk8下载
下载完成后可通过Xftp工具将文件上传到linux指定目录(下述为参考指令,具体结合实际的内容调整)
# 进入指定目录,并解压文件到指定目录
tar -zxvf jdk-8u181-linux-x64.tar.gz -C /usr/local/software
# 修改解压目录(相当于将文件全部移动到另一个目录)
mv jdk1.8.0_181 jdk1.8
步骤2:配置环境变量
# 1.编辑配置文件
vim /etc/profile
# 修改/etc/profile文件,配置JDK相关
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
export JAVA_HOME=/usr/local/software/jdk1.8
export PATH=$JAVA_HOME/bin:$PATH
# 2.编辑完成使配置文件生效,并检查配置
source /etc/profile
java -version
# 如果配置成功,则打印JDK版本信息如下所示,如果配置失败则需相应检查相关内容(变量、空格问题、路径)
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
(2)使用tar.gz 压缩包安装tomcat
步骤1:tomcat下载、安装
参考JDK引入的步骤,在/usr/local/software/soft中导入tomcat压缩包
# 进入指定目录,并解压文件到指定目录
tar -zxvf apache-tomcat-8.5.33.tar.gz -C /usr/local/software
# 修改解压目录(相当于将文件全部移动到另一个目录)
mv apache-tomcat-8.5.33 tomcat8.5
步骤2:tomcat配置
进入到tomcat下的bin目录执行开启指令,进行测试:
# 进入tomcat解压目录,执行bin下的startup.sh文件
cd /usr/local/software/tomcat8.5/bin
./startup.sh
显示上示内容tomcat正常启动,相应在虚拟机中开启浏览器分别用localhost:8080、ip:8080测试tomcat是否正常启动
如果是要在物理机上访问 http://ip 需要借助指令【 iptables –F】关闭防火墙,关闭后则可通过ip:8080的形式访问tomcat页面
(3)导入已有工程进行访问测试
如果是已有的工程,直接打包成war然后上传到tomcat发布路径进行测试即可,此处相应需要注意工程相关的配置文件处理。原有本地项目都是依托于本地环境的,相应地项目依托的线上环境也需要在linux中进行配置
最简单的组合式war+db的概念,需要在虚拟机上相应安装mysql数据库并设定其远程访问权限,随后将war中的db连接调整为”上线版本”的配置即可
将打包好的war放至tomcat下的webapps目录进行发布,随后重启tomcat应用(如果是热加载tomcat会自动加压、发布应用程序),待项目启动成功之后再在虚拟机中通过浏览器访问即可
此处需要注意的是,如果是实体机访问则需要打通防火墙、配置IP网关等,否则本地的实体机和虚拟机的物理机是隔离的,无法通过ip访问虚拟机的内容
b.其他环境配置问题
(1)wget下载软件出错
通过wget获取的部分软件如果不能出现正常解压的情况则考虑通过其他方式获取(通过官网手动下载安装包后传入服务器),例如由于oracle官网需要限定同意相关协议,而直接通过wget获取的jdk由于没有获得权限所以下载后的内容解压始终报错,导致软件无法正常安装
(2)mysql远程登录报错
解决步骤:
# 允许root用户在任何地方进行远程登录,并具有所有库的任何操作权限
- 1.在本机使用root用户登录mysql进行授权操作
mysql -u root -p "pwd"
grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
- 2.重载授权表
flush privileges;
- 3.退出mysql数据库
【2】常见linux部署项目问题
a.项目部署访问404
检查tomcat日志,查看项目是否正常启动:
常见tomcat启动报错:数据库连接错误(数据库配置)、项目本身存在错误(例如在window中设定的文件上传/下载路径不兼容linux中的项目版本或者是其他问题)
检查war项目解析是否正常:
检查解析后的war是否正常包含html和相关编译后的classes文件,可能存在项目打包的时候没有将java文件正常打包,在linux启动项目的时候虽然能够正常启动项目,但却由于缺少相关的classes导致正常不能访问项目。
排查:如果出现访问404,检查对应接口所在的Controller是否存在(是否正常解析),有些虽然存在文件夹,但实际上内容缺失文件
b.常用指令
(1)tomcat相关
将项目war放入tomcat的webapps目录下,然后进入tomcat安装路径的bin目录下:
启动tomcat服务:./startup.sh
关闭tomcat服务:./shutdown.sh
查看tomcat启动日志,tomcat安装目录/logs(日志文件):tail -500f catalina.out
(2)查看进程、杀死进程
指令“ps -ef | grep XXX”:显示当前服务器上,与关键字XXX有关的任务
例如,查看当前tomcat启动情况:ps -ef |grep tomcat
指令“kill -s 9 XXX”:强制杀除编号(进程号)为XXXXX的任务
(3)查看端口号占用
指令“netstat -anp |grep 端口号
”:查看端口号被占用的情况(以普通用户操作需加上 sudo,root用户操作则不需要)
netstat -anp |grep 3306
指令“netstat -nultp
”:查看当前所有已经使用的端口情况
c.内存不足
There is insufficient memory for the Java Runtime Environment to continue.
查看内存占用情况,检查占用内存最大的文件,及时清理空间