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
  1. 添加 MySQL 官方 Yum Repository

MySQL 不在默认的 CentOS 软件仓库中,需要手动添加 MySQL 官方仓库。

复制代码
sudo yum install https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
  1. 启用所需的 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.x
  • mysql57-community 表示 MySQL 5.7
  1. 安装 MySQL

运行以下命令安装 MySQL Server:

复制代码
sudo yum install mysql-community-server

如果安装不了就

如果你确认源可信,可以使用 --nogpgcheck 跳过 GPG 签名检查:

复制代码
sudo yum install mysql-community-server --nogpgcheck
  1. 启动 MySQL 服务

安装完成后,启动 MySQL 服务并设置为开机自启动:

复制代码
sudo systemctl start mysqld
sudo systemctl enable mysqld
  1. 获取初始密码

安装完成后,MySQL 会生成一个随机的 root 用户初始密码:

查看密码:

复制代码
sudo grep 'temporary password' /var/log/mysqld.log

使用随机生成的密码登录 MySQL 并配置安全选项

7.登录 MySQL:

复制代码
mysql -u root -p

登录成功!

修改密码 : 登录成功后,建议尽快修改 root 用户的密码。你可以使用以下命令来修改密码:

复制代码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Qyy@2024!'; 

修改密码成功

刷新权限: 修改密码后,执行以下命令使权限生效:

复制代码
FLUSH PRIVILEGES;
  1. 验证安装

查看 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"
相关推荐
怡人蝶梦2 小时前
Java后端技术栈问题排查实战:Spring Boot启动慢、Redis缓存击穿与Kafka消费堆积
java·jvm·redis·kafka·springboot·prometheus
瓯雅爱分享2 小时前
MES管理系统:Java+Vue,含源码与文档,实现生产过程实时监控、调度与优化,提升制造企业效能
java·mysql·vue·软件工程·源代码管理
蓝色天空的银码星2 小时前
Springcloud Alibaba自定义负载均衡详解
spring·spring cloud·负载均衡
鬼多不菜2 小时前
一篇学习CSS的笔记
java·前端·css
深色風信子2 小时前
Eclipse 插件开发 5.3 编辑器 监听输入
java·eclipse·编辑器·编辑器 监听输入·插件 监听输入
Blossom.1183 小时前
人工智能在智能健康监测中的创新应用与未来趋势
java·人工智能·深度学习·机器学习·语音识别
shangjg33 小时前
Kafka 如何保证不重复消费
java·分布式·后端·kafka
无处不在的海贼3 小时前
小明的Java面试奇遇之互联网保险系统架构与性能优化
java·面试·架构
Layux3 小时前
flowable候选人及候选人组(Candidate Users 、Candidate Groups)的应用包含拾取、归还、交接
java·数据库