本文介绍了在内网下的纯离线环境中部署 SpringBoot 前后端分离项目,由于是个前端仔,并未接触过linux,在经历诸多错误和踩坑之后,终于部署成功(大哭),在此记录一下。
工具选择
选择合适的工具进行远程连接,如 Xshell、Xftp、putty、Terminus 等
- Xshell:连接远程服务器的命令终端
- Xftp:连接远程服务器的资源,以 windows 文件夹的形式呈现
查看系统版本,下载的离线包版本应和 linux 系统版本一致
cd / # 进入文件主目录,所有的文件资源都在主目录下
cat /proc/version # 查看系统版本
首次进入的当前路径都是 /root,可以使用命令: pwd 查看当前所在路径
所有的资源文件都在 / 路径下
JAVA 环境搭建安装
下载 JDK
进入 JDK 官网,下载与开发所需的系统版本对应的压缩包类型:https://www.oracle.com/java/technologies/downloads/#java17
.tar.gz
类似 windows 的 压缩包.rpm
解压出来的文件是类似 exe 默认安装即可使用的 rpm 文件
选择
x64
版本就是为了和 linux 的系统版本对应
检查残留 JDK
查看有关 java 的相关文件
rpm -qa | grep java
如果显示有相关文件,则执行如下命令删除,无任何文件输出则忽略
rpm -qa | grep java |xargs rpm -e --nodeps
查看系统是否还存在 java 环境,未输出 java 相关版本即可。
java -version
上传 JDK
新建一个专门用来存放上传文件的文件夹。当前处于 /
路径下
mkdir -p data/software # 创建嵌套文件夹 /data/software
- 上传方法一:使用 Xftp 将下载的 jdk 压缩包上传至
software
文件夹下 - 上传方法二:使用命令将本地文件上传至 linux 服务器上
- 进入上传文件所在的目录执行 cmd 命令,例如上传 test 文件夹。(上传的文件必须在本机,外部 U 盘等文件无法识别)
# root:远程服务器登录名;10.xx.xx.xxx:服务器地址;/data/software:上传到服务器的指定路径下
scp test [email protected]:/data/software
# 输入 yes。输入远程服务器登录密码。
如果服务器系统进行了重装,再次连接需清除本地的关于远程服务器的缓存和公钥信息,执行命令:
ssh-keygen -R 10.xx.xx.xxx
安装 JDK
进入上传 jdk 的文件夹并解压,最后对解压出来的文件夹重命名
cd /data/software # 进入文件夹
ls # 查看当前目录的所有文件
tar -zxvf jdk-17_linux-x64_bin.tar.gz # 解压
mv jdk-17.0.8 jdk17 # 重命名为 jdk17
默认解压到当前文件夹下,若需要指定解压路径,则可以输入
tar -zxvf jdk-xxx -C /xxx/xxx/
配置环境变量
编辑 profile 文件。/etc/profile
的 profile 文件内部相当于 windows 的环境变量
也可以使用 Xftp 直接找到该文件进行编辑修改
vi /etc/profile
在文件最下方添加 jdk 的环境配置。如何添加参考下一小节
路径存储路径不同时,只需更改 JAVA_HOME
的路径即可。
# jdk config
export JAVA_HOME=/data/software/jdk17
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
执行命令使修改立即生效
source /etc/profile
java -version # 查看 jdk 环境是否安装成功
出现 jdk 的版本号等内容,即安装成功
vi 编辑内容使用方式
- 按
insert
键进入编辑模式,通过箭头移动编辑位置,在内容最后添加配置 - 写完后,点击
esc
按钮退出编辑模式,用命令:wq!
保存退出 :q!
:不保存退出:w
:保存文件:wq
:保存修改后退出编辑器:e!
:撤销修改
Mysql 环境搭建安装
删除残留 Mysql 和 Mariadb
删除残留 Mysql
- 删除数据库残留文件
rpm -qa | grep -i mysql # 查找数据库残留文件
# 卸载数据库安装文件,将刚刚查找到的 mysql 都卸载
rpm -ev --nodeps mysql-community-client-plugins-8.0.33-1.el7.x86_64
# .....
- 删除数据库相关的文件
find / -name mysql # 查找数据库相关的文件
rm -rf /var/lib/mysql # 依次将查找的文件删除
# ...
删除自带的 Mariadb
Centos7 默认安装的是 Mariadb 数据库,Mariadb保留了和 MySQL 一模一样的配置,所以安装 MySQL 时可能会和 Mariadb 产生冲突,此时就要卸载自带的 Mariadb
## 查看自带的Mariadb
rpm -qa | grep mariadb # or: yum list installed | grep mariadb
## 卸载
rpm -e --nodeps mariadb-xxx # or: yum -y remove mariadb-xxx
检查 etc/my.cnf
文件是否存在,存在就删除掉
find /etc -name "my.cnf"
rm -rf /etc/my.cnf # 若有路径输出,则执行删除命令
下载上传 Mysql
进入 Mysql 下载网址:https://dev.mysql.com/downloads/mysql/
通过输入:rpm -qa | grep glibc
,可查看当前 linux 系统内置的 glibc
版本
下载对应版本完成之后上传 Mysql 至 data/software
路径下并解压
# tar.xz 正常需解压两次:xz -d mysql-xx 解压出 tar 压缩包;再次 tar -xvf mysql-xx 解压出 mysql 文件夹
tar xvJf mysql-8.0.34-linux-glibc2.12-x86_64.tar.xz # xvJf 属于以上两命令的合并
mv mysql-8.0.34-linux-glibc2.12-x86_64 mysql # 重命名为 mysql
配置 Mysql 环境
初始化数据库
useradd mysql # 添加 mysql 用户
cd mysql # 在 mysql 目录下创建存储数据表的文件夹 data
mkdir data
cd bin # 进入 mysql 文件 的 bin 目录下
# 初始化mysql
./mysqld --initialize --user=mysql --datadir=/data/software/mysql/data --basedir=/data/software/mysql
- 如果初始化时出现如下错误(libaio 缺失)
- 下载
libaio
的 rpm 文件:点击 链接 直接下载liabio
的x86_64
位 rpm 包 - 上传到服务器并进入所在文件夹安装该 rpm:
rpm -ivf libaio-0.3.109-13.el7.x86_64.rpm
- 再次执行初始化 Mysql 的命令,出现类似如下内容即成功
一定要保存 mysql 的临时登录密码
系统所缺失的文件大部分都可以从该网站上搜索下载对应的 rpm 文件:https://pkgs.org
启动数据库服务
./mysqld_safe& # 启动临时服务 进入 mysql bin 目录下执行
# 登录数据库 在 bin 目录下执行
./mysql -uroot -p # 输入 mysql 初始密码进入 mysql
show databases; # 执行 sql 正常会报错,需要修改 Mysql 密码
如图所示:
此方式启动的 Mysql 服务为临时服务,回车就会结束该进程,所以在未进入 Mysql 时不能
ctrl+c
或者enter
修改 Mysql 初始密码
执行 show databases;
时出现如下错误,意思是必须先修改 mysql 密码
- 修改 mysql 密码
alter user 'root'@'localhost' identified by 'Root123..';
# 执行 quit 或者 exit 退出 mysql,重新进入输入的密码就是修改后的密码
添加环境配置
在配置环境变量之前,使用 systemctl status mysqld
之类的命令,系统是无法识别到的
- 在 etc 目录下新增 mysql 配置文件
my.cnf
touch /etc/my.cnf # 创建 my.cnf 文件
vi /etc/my.cnf # 编辑该文件,将配置代码粘贴进去保存
[mysqld]
# 指定 mysql 的路径
socket =/data/software/mysql/mysql.sock
basedir=/data/software/mysql
datadir=/data/software/mysql/data
[client]
socket =/data/software/mysql/mysql.sock
- 配置 Mysql 环境变量
vi /etc/profile
# 添加两行内容
export MYSQL_HOME=/data/software/mysql
export PATH=$PATH:$MYSQL_HOME/bin
# 如果已有多个环境变量,PATH 的配置使用以下命令,环境变量之间用 : 区分
export PATH=$PATH:已有的环境变量xxxxx:$MYSQL_HOME/bin
# 退出刷新环境变量
source /etc/profile
如图所示:
设置 Mysql 服务
- 设置 Mysql 服务运行文件
# 将服务文件 copy 至 etc/init.d 中,并重命名为 mysql 或者 mysqld
cp /data/software/mysql/support-files/mysql.server /etc/init.d/mysqld
# 对文件赋予执行权限
chmod 777 /etc/init.d/mysqld
# 增加 mysql 服务
chkconfig --add mysqld
# 查询 mysql 服务
chkconfig --list mysqld
# mysql 0:off 1:off 2:on 3:on 4:on 5:on 6:off
# 默认运行级别为 2 3 4 5 为 on,如果 3 4 5 为 off,则执行命令
chkconfig --level 345 mysqld on
此时可以选择查看 Mysql 的状态和控制启动
systemctl start mysqld # 启动 mysql 服务
systemctl status mysqld # 查询 mysql 运行状态
- 检查 mysql 配置
mysql -V # 查看 mysql 版本
此时应该是报找不到 mysql 的错误。原因是:系统默认会查找 /usr/bin
下的命令(大概),mysql 没有在这个目录下
- 设置 Mysql 路径映射
linux 中的软连接类似于在 windows 下,在另一个文件做一个该文件的 快捷方式
# ln -s 源文件地址 目标文件
ln -s /data/software/mysql/bin/mysql /usr/bin
启动 Mysql 服务如图所示:
将 Mysql 的服务文件地址映射到
/usr/bin
的原因是:之前从 Mysql 拷贝到/etc/init.d/mysqld
的服务进程文件默认读取的是/usr/bin/mysql
的路径
连接远程数据库
开放项目运行所需端口,常见 80、Mysql:3306、后端程序运行端口等,并重启防火墙
防火墙常用命令
firewall-cmd --state # 查看防火墙状态
systemctl start firewalld.service # 启动防火墙
systemctl stop firewalld.service # 关闭防火墙
systemctl enable firewalld.service # 设置开机自启动
firewall-cmd --zone=public --add-port=3306/tcp --permanent # 开放防火墙端口
firewall-cmd --reload # 重新加载配置
firewall-cmd --zone=public --list-ports # 查看开放的防火墙端口
做完如上部署,重新登录进到数据库,修改user表中的Host
# mysql -uroot -p123456 # 登录数据库
show databases; # 查看数据库
use mysql; # 使用mysql
select Host, User from user; # 查询表
update user set Host='%' where User='root'; # 修改User表内root用户的Host为%
flush privileges; # 刷新
此时即可使用本地 Navicat 尝试连接
如果需要再次修改密码
# 之前修改root 中的 host 是'%'
alter user 'root'@'%' identified with mysql_native_password by 'xxx';
Nginx 环境搭建安装
检查是否有 Nginx
whereis nginx
rm -rf ngin-xxxx # 若有文件输出,则执行删除命令
下载 Nginx 及依赖
安装 Nginx 所需依赖
安装 gcc 和 gcc-c++
下载如下依赖并上传服务器:下载地址(阿里云镜像):http://mirrors.aliyun.com/centos/7/os/x86_64/Packages/
安装的内容较多,可以单独建个文件夹存放,安装完的即可删除。
- gcc 依赖清单
- cpp-4.8.5-44.el7.x86_64.rpm
- gcc-4.8.5-44.el7.x86_64.rpm
- glibc-devel-2.17-317.el7.x86_64.rpm
- glibc-headers-2.17-317.el7.x86_64.rpm
- kernel-headers-3.10.0-1160.el7.x86_64.rpm
- libmpc-1.0.1-3.el7.x86_64.rpm
- mpfr-3.1.1-4.el7.x86_64.rpm
- gcc-c++ 依赖清单
- gcc-c++-4.8.5-44.el7.x86_64.rpm
- libstdc++-4.8.5-44.el7.x86_64.rpm
- libstdc++-devel-4.8.5-44.el7.x86_64.rpm
- pcre 依赖清单(新版 pcre2-xxx 可能需要以下依赖,如果是旧版 pcre-8.45 应该不需要)
- pcre-devel-8.32-17.el7.x86_64.rpm
- pcre2-10.23-2.el7.x86_64.rpm
进入上传目录,安装以上 rpm 包
rpm -ivh --nodeps ... # 依次安装
# or 批量安装命令
rpm -Uvh *.rpm --nodeps --force
批量安装需尽量保持只有当前文件夹内部只有上述 rpm 包,
--nodeps
为不依赖,批量安装时,其它 rpm 包可能会受到影响
- 验证安装(出现版本信息即安装成功)
gcc -v
安装 pcre
下载地址:http://www.pcre.org/
其中有两个下载链接地址:旧版的 pcre 和新版的 pcre2,如果使用 pcre2,则需要安装对应的 rpm 依赖包
上传解压安装包:将下载好的安装包上传到服务器,并解压。新版解压出的文件名一般是 pcre2
tar -zxvf pcre2-10.42.tar.gz # 解压
cd pcre2-10.42 # 进入文件夹
./configure
make && make install
下载安装 zlib
- 下载zlib:http://www.zlib.net/
- 上传解压安装包(操作和 安装 pcre 步骤一致)
下载安装 openssl
下载地址:https://www.openssl.org/source/
上传解压安装包:将下载好的安装包上传到服务器,并解压。
tar -zxvf openssl-1.1.1u.tar.gz # 解压
cd openssl-1.1.1u # 进入文件夹
./config
make && make install
安装完成后,控制台输入 openssl version
,出现版本信息则说明安装成功。若出现类似错误:openssl: error while loading shared libraries: libcrypto.so.1.1: cannot open shared object file: No such file or directory
,原因是 openssl 运行库位置不正确造成的。
执行如下命令后重新查看。
ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
下载 Nginx
去 Nginx 官网 下载对应的版本
将 nginx 上传至服务器 /data/software
文件夹下解压
cd /data/software
tar -zxvf nginx-1.24.0.tar.gz # 解压
mv nginx-1.24.0 nginx # 重命名
安装 Nginx
配置 nginx
cd data/software/nginx
./configure # 在此之前安装了 openssl 的相关依赖,这里就不会报错了
make && make install
启动 nginx
whereis nginx #查找 nginx 文件,一般都在 /usr/local/nginx
cd /usr/local/nginx #进入该文件
cd ./sbin #进入sbin文件
./nginx #启动nginx程序
直接访问 IP 地址如下出现 Nginx 的页面就算 Nginx 环境部署完成
至此,linux 的基本环境搭建已全部完成
前后端分离部署
在 data 文件夹下新建 project 文件,用来分别存放前后端的项目文件
后端部署
将打包的 jar 包上传至 /data/project/server
目录下
先运行 jar 包看是否有启动问题
java -jar xxx.jar
# 无问题时,可选择不挂断连接运行,关闭连接依然运行 jar 程序
nohup java -jar xxx.jar >logs.log & # 指定输出文件为 logs.log,不指定,删除 >logs.log & 即可
用 nohub 命令启动 jar 包,是在后台不挂断运行,关闭终端窗口或者
CTRL + C
命令也不会终止程序。
当用 nohub 命令启动 jar 包的时候,如果不指定日志输出文件,则所有的输出都会被重定向到当前目录的nohub.out
文件中。
重新部署
新旧 jar 包替换重新部署
cd /data/project/server # 进入项目所在文件夹
ps -ef | grep java # 查看 java 中运行的进程PID
# 终止正在运行的 java 进程,将其终止
kill -9 # 终止所在的进程 例如:kill -9 21097
# 最后重新启动新的 jar 包
nohup java -jar xxx.jar >logs.log &
前端部署
同样打包上传至 /data/project
文件夹下,不需要做任何操作
配置 Nginx 代理
Nginx 的配置文件一般在 /usr/local/nginx/conf/nginx.conf
# 编辑 nginx.conf 文件
vi /usr/local/nginx/conf/nginx.conf
# 找到有关 server 的配置
server {
listen 80;
server_name ip地址;
charset utf-8;
location / {
root /data/project/dist; # 前端文件所在目录
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
# 前端以 /api 开头的请求都会转发到后端服务接口
# 该代理方式可以视为 nginx 本地转发,非必需情况下,可以只保留后端运行端口,关闭 3306 6379等,防止被攻击
location /api {
proxy_pass http://ipxx:xxx/admin;
proxy_set_header x-forwarded-for $remote_addr;
}
}
每次修改 nginx 之后都需要重启 Nginx
cd /usr/local/nginx/sbin/
./nginx -s reload
后端项目问题
字体缺失
项目内部代码使用验证码时,linux 上没有对应的字体,会出现以下错误:
Cannot load from short array because "sun.awt.FontConfiguration.head" is null
rpm -ivh fontconfig-2.13.0-4.3.el7.x86_64.rpm --nodeps --force
rpm -ivh ttmkfdir-3.0.9-42.el7.x86_64.rpm --nodeps --force
创建一个字体文件夹,从 Windows 的 C:\Windows\Fonts
文件中将程序所使用的字体,上传到 myfonts
文件夹下
cd /usr/share/fontconfig/
mkdir myfonts # 创建字体文件目录
chmod -R 755 /usr/share/fontconfig/myfonts/ # 给该文件夹赋权
ttmkfdir -e /usr/share/X11/fonts/encodings/encodings.dir # 执行 ttmkfdir 命令
查看字体配置文件中的字体路径,是否正确
vim /etc/fonts/fonts.conf
# 修改字体文件路径
<!-- Font directory list -->
<dir>/usr/share/fontconfig/myfonts</dir>
刷新字体缓存使配置对系统生效(不用重启linux服务器)
fc-cache # 刷新字体换缓存
fc-list :lang=zh # 查看字体是否安装成功
标签:文件,SpringBoot,--,data,Linux,离线,nginx,mysql,rpm
From: https://www.cnblogs.com/jsonq/p/18032447