28.<Spring博客系统⑤(部署的整个过程(CentOS))>
引入依赖
Spring-boot-maven-plugin
用maven进行打包的时候必须用到这个插件。看看自己pom.xml中有没有这个插件
并且看看配置正确不正常。
注:我们这个项目打的jar包在30MB左右。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
部署前的准备
1.linux环境搭建
(我使用的是腾讯云服务器)
Xshell、finalshell只是客户端。通过一些SSH协议等等连接上了云服务器。
通过这个客户端连接服务器。我们的服务器在腾讯的机房。我们的机器大概率是虚拟机的一小块。
Linux发行版:
通用用途(适合个人和企业用户):Ubuntu、Debian、Fedora、openSUSE
企业级发行版(稳定性和支持性强):RHEL、CentOS、AlmaLinux & Rocky Linux、Oracle Linux
我的是CentOS
cat /etc/centos-release
2.Java环境搭建
我们部署Spring项目,只需要JDK和MySQL就行了。
2.1安装MySQL
在 CentOS 上使用 yum 安装 MySQL
1.CentOS 通常默认安装 MariaDB,需先卸载以避免冲突:
sudo yum remove mariadb* -y
2. 添加 MySQL 官方 Yum Repository
MySQL 不在默认的 CentOS 软件仓库中,需要手动添加 MySQL 官方仓库。
sudo yum install https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
3. 启用所需的 MySQL 版本
MySQL 官方仓库默认启用的是 MySQL 8.x。如果需要其他版本(如 MySQL 5.7),可以切换仓库。
查看可用仓库:
yum repolist all | grep mysql
启用 MySQL 5.7(示例):
通过这两行命令。我们再次查看可用仓库发现5.7被启用
sudo yum-config-manager --disable mysql80-community sudo yum-config-manager --enable mysql57-community
默认仓库:
mysql80-community
表示 MySQL 8.xmysql57-community
表示 MySQL 5.74. 安装 MySQL
运行以下命令安装 MySQL Server:
sudo yum install mysql-community-server
如果安装不了就
如果你确认源可信,可以使用
--nogpgcheck
跳过 GPG 签名检查:sudo yum install mysql-community-server --nogpgcheck
5. 启动 MySQL 服务
安装完成后,启动 MySQL 服务并设置为开机自启动:
sudo systemctl start mysqld sudo systemctl enable mysqld
6. 获取初始密码
安装完成后,MySQL 会生成一个随机的 root 用户初始密码:
查看密码:
sudo grep 'temporary password' /var/log/mysqld.log
使用随机生成的密码登录 MySQL 并配置安全选项
7.登录 MySQL:
mysql -u root -p
登录成功!
修改密码: 登录成功后,建议尽快修改
root
用户的密码。你可以使用以下命令来修改密码:ALTER USER 'root'@'localhost' IDENTIFIED BY '@Qyy2024!';
修改密码成功
刷新权限: 修改密码后,执行以下命令使权限生效:
FLUSH PRIVILEGES;
8. 验证安装
查看 MySQL 服务状态:
sudo systemctl status mysqld
登录 MySQL 检查版本:
mysql -u root -p mysql> SELECT VERSION();
退出mySQL
exit;
2.2安装JDK
1.更新软件包列表
首先,确保你的系统软件包是最新的:
sudo yum update -y
2. 安装 JDK 8
使用 Yum 安装
CentOS 7 默认的软件仓库中可以找到 OpenJDK 8。你可以使用以下命令来安装:
sudo yum install java-1.8.0-openjdk-devel -y
这将安装 OpenJDK 8(开发工具包)。安装完成后,使用以下命令检查 JDK 版本:
java -version
一、部署 Web 项目到 Linux
1.1部署简介
工作中涉及到的 "环境"
开发环境:开发人员写代码用的机器。
测试环境:测试人员测试程序使用的机器。
生产环境(线上环境):最终项目发布时所使用的机器,对稳定性要求很高。把程序安装到生产环境上,这个过程称为“部署”,也叫“上线”。
一旦程序部署成功,那么这个程序就能被外网中千千万万的普通用户访问到。
换句话说,如果程序有 BUG,这个 BUG 也就被千千万万的用户看到了。部署过程至关重要,属于程序开发中最重要的一环。一旦部署出现问题,极有可能导致严重的事故(服务器不可用之类的)。
为了防止部署出错,一般公司内部都有一些自动化部署工具(如 Jenkins 等)。当前我们先使用手工部署的方式来完成部署。
1.2环境配置
程序正常运行,需要保证环境和程序都正确。我们需要先设置环境。
下面内容都算是在配置环境
二、数据准备
按照之前的数据库建表脚本,在服务器上运行,建立相同的表结构。
2.1进入MySQL
使用下面命令
mysql -u root -p
然后输入你设定的数据库密码。
进入MySQL
2.2查看所有数据库
SHOW DATABASES;
2.2建立项目数据库
create database if not exists spring_blog charset utf8mb4;
2.3创建并插入用户表的数据
创建用户表
DROP TABLE IF EXISTS spring_blog.user;
CREATE TABLE spring_blog.user(
`id` INT NOT NULL AUTO_INCREMENT,
`user_name` VARCHAR ( 128 ) NOT NULL,
`password` VARCHAR ( 128 ) NOT NULL,
`github_url` VARCHAR ( 128 ) NULL,
`delete_flag` TINYINT ( 4 ) NULL DEFAULT 0,
`create_time` DATETIME DEFAULT now(),
`update_time` DATETIME DEFAULT now(),
PRIMARY KEY ( id ),
UNIQUE INDEX user_name_UNIQUE ( user_name ASC )) ENGINE = INNODB DEFAULT
CHARACTER SET = utf8mb4 COMMENT = '⽤⼾表';
插入数据
INSERT INTO spring_blog.user (id, user_name, password, github_url, delete_flag, create_time, update_time) VALUES (1, '祁洋洋', 'd320f77068b94c09917527a01e66641237df2f24979a5640223d68eda19db72f', 'https://gitee.com/Bwindmill', 0, '2024-11-11 18:06:02', '2024-11-11 18:06:02');
INSERT INTO spring_blog.user (id, user_name, password, github_url, delete_flag, create_time, update_time) VALUES (2, 'lisi', '0f1aa87de7264681bedd1a93ec2a1c7e03f98725955d67127895a573aa54eeea', 'https://gitee.com/Bwindmill', 0, '2024-11-11 18:06:02', '2024-11-11 18:06:02');
INSERT INTO spring_blog.user (id, user_name, password, github_url, delete_flag, create_time, update_time) VALUES (3, 'wangwu', '9462b4c2bc2a400fae42215063b0da7a8afef7e4684de09de9158af4454a7066', 'https://gitee.com/Bwindmill', 0, '2024-11-11 18:06:02', '2024-11-11 18:06:02');
INSERT INTO spring_blog.user (id, user_name, password, github_url, delete_flag, create_time, update_time) VALUES (4, 'luliu', '809a42b7834c42bcbf0344112766947d3c8f106803baf19a0736febd045afe55', 'https://gitee.com/Bwindmill', 0, '2024-11-11 18:06:02', '2024-11-11 18:06:02');
2.4创建并插入博客表的数据
drop table if exists spring_blog.blog;
CREATE TABLE spring_blog.blog (
`id` INT NOT NULL AUTO_INCREMENT,
`title` VARCHAR(200) NULL,
`content` TEXT NULL,
`user_id` INT(11) NULL,
`delete_flag` TINYINT(4) NULL DEFAULT 0,
`create_time` DATETIME DEFAULT now(),
`update_time` DATETIME DEFAULT now(),
PRIMARY KEY (id))
ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '博客表';
INSERT INTO spring_blog.blog (id, title, content, user_id, delete_flag, create_time, update_time) VALUES (1, '第⼀篇博客', '1111111', 1, 0, '2024-11-12 18:09:29', '2024-11-12 18:09:29');
INSERT INTO spring_blog.blog (id, title, content, user_id, delete_flag, create_time, update_time) VALUES (2, '代码测试', '你好我是测试的正文', 2, 1, '2024-11-12 18:09:29', '2024-11-12 18:09:29');
INSERT INTO spring_blog.blog (id, title, content, user_id, delete_flag, create_time, update_time) VALUES (3, '我是第三篇博客', '你好你好我是第三篇博客的正文', 2, 0, '2024-11-12 18:14:53', '2024-11-12 18:14:53');
INSERT INTO spring_blog.blog (id, title, content, user_id, delete_flag, create_time, update_time) VALUES (4, '这是我今天写的博客11/13', '我真的服了,今天我太坏了了,我大黑阿辉阿訇后哦ID除外反馈就问你打开几句话ID号呕吼后欧欧尼哦i就哦ID哦ijoin1io囧', 1, 0, '2024-11-13 21:31:54', '2024-11-13 21:31:54');
INSERT INTO spring_blog.blog (id, title, content, user_id, delete_flag, create_time, update_time) VALUES (5, '测试一下', '##在这里写下一篇博客
咋回事呀我回答我i啊好ID
#带娃地哦啊哦判定为', 1, 0, '2024-11-13 21:50:37', '2024-11-13 21:50:37');
INSERT INTO spring_blog.blog (id, title, content, user_id, delete_flag, create_time, update_time) VALUES (6, '今天是什么日子', '#一、今天
##1.1今天是什么
今天是个好日子。好呀好日子。
##1.2今天能干什么
今天我吃饭了,写了博客系统的好多内容。我还准备早点睡觉呢红红火火恍恍惚惚哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈', 1, 0, '2024-11-13 22:09:02', '2024-11-13 22:09:02');
INSERT INTO spring_blog.blog (id, title, content, user_id, delete_flag, create_time, update_time) VALUES (7, '今天的博客日记', '##一、这是我新发布的一篇博客
今天我要做的内容有很多。首先上完课。再利用课余时间好好的学习Java呀红红火火恍恍惚惚哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈', 1, 0, '2024-11-14 11:18:29', '2024-11-14 11:18:29');
INSERT INTO spring_blog.blog (id, title, content, user_id, delete_flag, create_time, update_time) VALUES (8, '哈达', '##在这里写下一篇博客
这是待删除博客', 1, 1, '2024-11-14 22:24:24', '2024-11-14 22:24:24');
INSERT INTO spring_blog.blog (id, title, content, user_id, delete_flag, create_time, update_time) VALUES (9, '这是我LiSi的文章', '##在这里写下一篇博客
这是我发布的文章,希望大家支持!!!', 2, 0, '2024-11-16 14:02:19', '2024-11-16 14:02:19');
INSERT INTO spring_blog.blog (id, title, content, user_id, delete_flag, create_time, update_time) VALUES (10, '我是第三篇博客', '你好你好我是第三篇博客的正文', 2, 0, '2024-11-16 22:11:53', '2024-11-16 22:11:53');
2.5查看我们创建的数据库以及数据表
博客中的数据太多了就不截图了。自此数据准备工作完成。
三、(打prod版本的Jar包)程序配置文件修改
实际工作中,开发环境、测试环境以及生产环境的配置都是不一样的,例如 MySQL 的用户名和密码。
我们可以针对不同的环境,设置不同的配置文件。3.1创建application-dev.yml文件
写入我们原本的配置文件
# 应用服务 WEB 访问端口 server: port: 1208 spring: datasource: url: jdbc:mysql://127.0.0.1:3306/spring_blog?characterEncoding=utf8&use username: root password: 12345678 driver-class-name: com.mysql.cj.jdbc.Driver mybatis: configuration: map-underscore-to-camel-case: true #配置驼峰⾃动转换 #user_id转userId log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句 mapper-locations: classpath:mapper/**Mapper.xml #设置⽇志⽂件的⽂件名 logging: file: name: spring-blog.log
3.2创建application-prod.yml文件
写入部署到linux环境中的配置文件
# 应用服务 WEB 访问端口 server: port: 1208 spring: datasource: url: jdbc:mysql://127.0.0.1:3306/spring_blog?characterEncoding=utf8&use username: root password: "@Qyy2024!" driver-class-name: com.mysql.cj.jdbc.Driver mybatis: configuration: map-underscore-to-camel-case: true #配置驼峰⾃动转换 #user_id转userId # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句 mapper-locations: classpath:mapper/**Mapper.xml #设置⽇志⽂件的⽂件名 logging: file: name: spring-blog.log
在pom.xml添加如下代码
3.3自定义配置pom.xml
<profiles> <profile> <id>dev</id> <properties> <!--自定义配置--> <profile.name>dev</profile.name> </properties> </profile> <profile> <id>prod</id> <properties> <!--自定义配置--> <profile.name>prod</profile.name> </properties> </profile> </profiles>
maven中上面会出现一个配置文件。
我们在原本的配置文件
3.4application.yml文件
中写入
spring: profiles: active: ${profile.name} // active: @profile.name@
这样我们就可以勾选。便于我们引用不同配置文件了
我们打一个prod版本的jar包。
多平台文件配置
在多平台部署时,可能需要为不同的操作系统或平台配置不同的文件。根据平台的不同,配置文件的内容也需要做相应调整,确保程序能够在所有目标平台上正确运行。
四、正式部署
4.1创建部署目录
我们将项目部署在
Production-deployment/spring_blog目录下面
4.2将jar包放到部署目录中
拖动jar包。到这个目录中(由于我使用的是finalshell不支持拖拽方式将
.jar
文件从 Windows 本地环境传输到服务器。)
我使用
SCP
从 Windows 上传.jar
文件到 CentOS 服务器:下载并安装 WinSCP。
- 输入你的服务器 IP 地址、SSH 登录用户名、以及密码。
- 连接到你的 CentOS 服务器。
然后我就可进行拖拽了
放置成功!
4.3开放端口号
参考链接:
Centos防火墙设置与端口开放的方法
如何还不行就
云服务器上看 安全组 开放1208端口
4.4启动项目!!!
4.4.1通过 java -jar jar包全名(非后台启动方式)
这种方式当我们把启动的窗口关掉。进程也就被杀掉了。
示例:
java -jar spring-blog-0.0.1-SNAPSHOT.jar
启动成功!
不过
4.4.2 nohup .... & (后台启动方式)
完整命令
nohup java -jar spring-blog-0.0.1-SNAPSHOT.jar &
这样启动之后。即便我们关掉启动窗口。服务依然是启动的
这样启动敲空格后是可以直接输入命令的。看错误日志也可以直接在这里看
检查日志输出
默认情况下,
nohup
会将日志输出到nohup.out
文件。查看该文件内容:cat nohup.out
如果内容过多,使用tail
命令查看最新的日志:tail -n 50 nohup.out
eg:
tail -100f spring-blog.log
查看下面100行日志
坑点:
通过后台部署。如果 项目进行更新了。我们启动新的jar包。
我们以为更新部署成功。实际上么有。一定要通过
cat nohup.out
看日志
这时候会发现
报错了。端口号已经被使用了。项目部署失败。
解决办法:
1.杀死进程(推荐)
首先查看进程Id.如下图14723就是我们spring_blog系统的进程Id
ps -ef|grep java
使用kill -9 杀掉进程
kill -9 14723
如上图,进程已经被杀死。此时我们就可以发布新的jar包了
2.修改端口号
nohup java -jar spring-blog-0.0.1-SNAPSHOT.jar --server.port=9090 &
不过此时我们就启动了两个程序了。
不过此时日志混在了一起。我们也可以进行指定日志。
4.5启动项目时遇到的问题
4.5.1要我将@profile.name@修改为${profile.name}
spring:
profiles:
active: @profile.name@
修改为
spring:
profiles:
active: ${profile.name}
不过这样修改之后还是有点问题。因此我直接
spring:
profiles:
active: prod
自此项目终于启动成功!!!!!
4.5.2无法访问
考虑原因
1.服务未启动
2.端口未开放
看服务是否启动的方法
1.通过命令
ps -ef|grep java
ps -ef 拿到所有程序
grep java 查询进程里面有java的东西
如图并没有查询到我们的java程序。 这个查出来的只是grep命令。
然后我们启动服务再次查询
2.通过curl
curl http://127.0.0.1:1208/blog_login.html
若能得到Html代码,说明服务已经启动。那么就是端口号未开放了。只需要去开放端口号就行了
注意事项:
1.在配置文件中 IP 地址依然是:127.0.0.1
2.部署后打开项目的 IP 地址填云服务器的公网IP地址。也就是主机。
我的是 150.158.148.151
3.错误日志跟踪命令
tail -f spring.log | grep "ERROR"