【博客系统】博客系统第十一弹:部署博客系统项目到 Linux 系统

article/2025/8/22 7:23:04

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


搭建 Java 部署环境


apt


apt(Advanced Packaging Tool)是 Linux 软件包管理工具,用于在 Ubuntu、Debian 和相关 Linux 发行版上安装、更新、删除和管理 deb 软件包。

大多数 apt 命令必须以具有 sudo 权限的用户身份运行。


apt 常用命令


列出所有软件包

apt list

这个命令输出所有包的列表,内容比较多,可以使用 grep 命令过滤输出。

apt list | grep "java"

更新软件包数据库

sudo apt-get update

apt 实际上在可用软件包的数据库上工作。如果数据库没有更新,系统将不知道是否有更新的软件包可用。这就是为什么在安装任何 Linux 系统之后,第一件事应该是更新 apt 数据库。运行此命令时,将看到从各种服务器检索到的软件包信息。

如果切换到 root 用户,命令前就不需要加 sudo 了。


切换 root 用户

sudo su

安装软件包

sudo apt install package_name

移除软件包

sudo apt remove package_name

remove 命令将卸载给定的软件包,但可能会留下一些配置文件。如果要删除包含所有配置文件的软件包,请使用 purge 而不是 remove


apt removeapt purge 的区别


  • apt remove 删除包的二进制文件,它留下了残留的配置文件。
  • apt purge 删除与包相关的所有内容,包括配置文件。
  • 如果弄乱了程序的配置,希望从系统中完全清除它的痕迹再重新开始,可以使用 apt purge
  • 通常使用 apt remove 就足够了。

JDK


1. 更新软件包

sudo apt-get update

2. 安装 OpenJDK

查找 JDK 包

apt list | grep "jdk"

安装 JDK

sudo apt install openjdk-17-jdk

注意

  • 此处安装的是 OpenJDK,OpenJDK 是一个开源版本的 JDK,和 Oracle 官方的 JDK 略有差别。此处我们就使用 OpenJDK 即可。安装 Oracle JDK 比较麻烦。
  • 使用 java -version 验证是否安装成功。
  • 如果提示 “java 命令找不到” 则说明安装失败。

image-20250529160653334


3. 卸载 OpenJDK


  1. 检查安装的是哪个 OpenJDK

    dpkg --list | grep -i jdk
    
  2. 移除 OpenJDK 包

    apt-get purge openjdk*
    
  3. 卸载 OpenJDK 相关包

    apt-get purge icedtea-* openjdk-*
    
  4. 检查所有 OpenJDK 包是否都已卸载完毕

    dpkg --list | grep -i jdk
    

MySQL


使用 apt 安装 MySQL


  1. 查找安装包

    apt list | grep "mysql-server"
    
  2. 安装 MySQL

    sudo apt install mysql-server
    

查看 MySQL 状态


sudo systemctl status mysql

image-20250529161153518


MySQL 安装安全设置


默认的 MySQL 设置是不安全的,MySQL 安装提供了一个安全脚本,用于解决不太安全的默认选项。


运行以下命令

sudo mysql_secure_installation #安装安全设置

执行过程

  1. 是否设置验证密码组件

    Press y|Y for Yes, any other key for No: Y #是否设置验证密码组件
    
  2. 密码强度设置

    Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2 #设置密码强度
    
  3. 删除匿名用户

    Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y #默认情况下,MySQL安装有一个匿名用户, 允许任何人登录MySQL. 是否删除匿名用户?
    
  4. 禁止 root 用户远程登录

    Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y #仅应允许root从'localhost'连接
    
  5. 删除 test 数据库

    Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y #默认情况下, MySQL带有⼀个test数据库, 是否删除?
    
  6. 重新加载权限表

    Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y #是否现在加载配置, 使刚才的修改生效?
    
  7. 完成

    All done!
    

通过以上步骤,MySQL 的安全设置已经完成,确保了数据库的安全性。设置密码


连接 MySQL 服务器


sudo mysql

使用 ALTER USER 命令修改密码


ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'BITE@yyds.666';

退出 MySQL


exit

image-20250529164241001


再次登录输入:

mysql -uroot -p   #  密码: BITE@yyds.666

卸载 MySQL


  1. 停止 MySQL
sudo systemctl stop mysql

  1. 卸载 MySQL
sudo apt-get remove --purge mysql-server mysql-client mysql-common

  1. 删除 MySQL 配置文件和数据
sudo rm -rf /etc/mysql /var/lib/mysql

  1. 清理残留文件和目录
sudo apt-get autoremove
sudo apt-get autoclean

  1. 验证卸载结果
mysql --version

部署 Web 项目到 Linux


环境配置


确保程序正常运行需完成以下配置:

  1. 数据库准备

    • 执行提供的建表脚本,确保表结构与服务器一致
  2. 多环境配置

    • 按环境创建配置文件(如开发/测试/生产环境)
    • 命名格式:application-XXX.ymlapplication-XXX.properties
    • 差异化配置项示例:MySQL账号密码、服务端口等

关键点:通过文件命名区分环境,避免硬编码敏感信息。


以下以application-XXX.yml为例:

application-dev.yml: 开发环境配置

image-20250529175414319

server:port: 8080spring:datasource:url: jdbc:mysql://127.0.0.1:3306/java_blog_spring?characterEncoding=utf8&useSSL=falseusername: rootpassword: 123456  # windows 数据库密码driver-class-name: com.mysql.cj.jdbc.Drivermybatis-plus:configuration:map-underscore-to-camel-case: true
#      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl   # linux 服务器没必要打日志, 打日志也会影响性能logging:file:name: spring-blog.log

application-prod.yml: 生产环境配置

image-20250529175444889

server:port: 8080spring:datasource:url: jdbc:mysql://127.0.0.1:3306/java_blog_spring?characterEncoding=utf8&useSSL=falseusername: rootpassword: BITE@yyds.666 # linux 数据库密码driver-class-name: com.mysql.cj.jdbc.Drivermybatis-plus:configuration:map-underscore-to-camel-case: true
#      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl   logging:file:name: spring-blog.log

如果同时有三个yml文件,通常只有主配置文件application.yml会自动生效。为了使其他配置文件(如application-prod.ymlapplication-dev.yml)生效,需要在主配置文件application.yml中进行相应的配置。具体步骤如下:

  1. 删除主配置文件中的数据库相关配置: 在application.yml中删除与数据库相关的配置项,以避免冲突。
  2. 指定生效的配置文件: 在application.yml中添加配置,指定使用application-prod.ymlapplication-dev.yml作为生效的配置文件。

image-20250529175812878

spring:profiles:active: prodspring:profiles:active: dev

在Spring框架中,spring.profiles.active属性用于指定激活的配置文件。

这里的active属性值填的是配置文件名的一部分(如devprod等),而不是完整的文件名(如application-prod.ymlapplication-dev.yml)。


启动程序:

image-20250529181815211


测试接口:

image-20250529182232839


当前配置文件中的数据库密码是按照 Linux 系统的设置来配置的,与 Windows 系统的数据库密码不一致,从而导致接口访问失败:

image-20250529182539655


在不同环境之间来回切换时,需要频繁修改配置文件中的active值。在多人协作的场景下,很容易出现忘记修改active值的情况,从而导致配置错误。

为了避免这种情况,我们可以通过从 Maven 中读取环境配置变量来为active赋值:

image-20250529184152481

<profiles><profile><id>dev</id><properties><profile.name>dev</profile.name></properties></profile><profile><id>prod</id><activation><activeByDefault>true</activeByDefault></activation><properties><profile.name>prod</profile.name></properties></profile>
</profiles>

注意,每次勾选新的 profile 都需要刷新 maven


修改 application.yml

spring:profiles:active: @profile.name@

image-20250529185215864


勾选好 profile 后,刷新 maven,重新运行程序:

image-20250529185507098


测试接口,此时接口访问成功:

image-20250529184623409


构建项目并打包


在本地使用 Maven 进行打包

  1. 如果 Test 代码中有与环境配置相关的操作(比如数据库相关的操作),打包会失败,可以跳过测试。
  2. 点击 clean -> package

上传 Jar 包到服务器并运行


1. 上传 Jar 包


dev 切换成 prod,刷新 maven 并打包:

image-20250529190134939


因为这个项目使用的是 mybatis-plus ,所以不需要写 mybatis 的测试用例,所以打包成功

image-20250529192016934

  • 如果使用的是 MyBatis 而非 MyBatis-Plus,就需要在单元测试中编写 MyBatis 的接口测试代码

  • Maven 的配置文件中,如果选择了prod环境配置并刷新了 Maven,然后按照生命周期package命令进行打包,那么 Maven 会依次执行clean、validate、compile、test、package阶段:image-20250529191432762

  • 在 Maven 的 test 阶段运行单元测试时,由于配置的数据库密码与 Windows 系统的数据库密码不一致,导致 MyBatis 无法连接到数据库,从而使得单元测试失败

  • 单元测试失败会中断 Maven 的打包过程,导致打包失败

  • 解决方案:在打包前,设置去掉 test 阶段,避免打包过程因为 test 的问题导致打包过程被打断:image-20250529191733447

接下来,找到打好的 Jar 包:

image-20250529192828340


在 linux 系统中,创建和 windows 对应数据库及数据表

-- 建表 SQL
create database if not exists java_blog_spring charset utf8mb4;use java_blog_spring;-- 用户表
DROP TABLE IF EXISTS java_blog_spring.user_info;
CREATE TABLE java_blog_spring.user_info(
`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() ON UPDATE now(),
PRIMARY KEY (id),
UNIQUE INDEX user_name_UNIQUE (user_name ASC)) ENGINE = INNODB DEFAULT CHARACTER SET = utf8mb4 COMMENT = '用户表';-- 博客表
drop table if exists java_blog_spring.blog_info;
CREATE TABLE java_blog_spring.blog_info (
`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() ON UPDATE now(),
PRIMARY KEY (id))
ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '博客表';-- 新增用户信息
insert into java_blog_spring.user_info (user_name, password, github_url) values("zhangsan", "123456", "https://gitee.com/bubblefish666/class-java45");
insert into java_blog_spring.user_info (user_name, password, github_url) values("lisi", "123456", "https://gitee.com/bubblefish666/class-java45");insert into java_blog_spring.blog_info (title, content, user_id) values("第一篇博客", "111我是博客正文我是博客正文我是博客正文", 1);
insert into java_blog_spring.blog_info (title, content, user_id) values("第二篇博客", "222我是博客正文我是博客正文我是博客正文", 2);

为了能通过加密、加盐功能的密码校验,更新 linux 数据库表中,用户的密码:

update user_info set password= 'e5bf3de57e3243ab9d94b59b379a0a640f967f2e3ae738c2f5474ab0fe46389b' where id in(1,2);

image-20250529193626767


直接拖动打好的 Jar 包到 Xshell 窗口即可完成文件的上传。

image-20250529194002503

Xshell 可以直接拖动文件到窗口,达到上传文件的目的。如果使用其他客户端,不支持文件的上传,需要借助 lrzsz 命令;


借助 mv 改一下 jar 包名:

image-20250529194152710


2. 运行程序


接下来,在 linux 上运行该 jar 包:

java -jar blog.jar

image-20250529194511729

这种部署方式,如果按 ctrl+c ,那么部署好的服务就无法被服务了;正确的启动命令:

nohup java -jar blog.jar &
  • nohup:后台运行程序。用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。

  • 语法格式:

    nohup Command [Arg …] [&]
    
  • 参数说明:

    • Command:要执行的命令。
    • Arg:一些参数,可以指定输出文件。
    • &:让命令在后台执行,终端退出后命令仍旧执行。
  • 示例:

    nohup java -jar blog-0.0.1-SNAPSHOT.jar >/logs &
    
  • Linux 可以通过 > 把需要输出的内容写到指定文件中。这样的操作称为“重定向”。


开放端口号


如果外网需要访问该服务,需要先服务器防火墙开放对应的端口号。

本着服务器安全的原则,云服务器上的端口非必要不开启。比如常见端口号:数据库 3306、Redis 6379,尽可能避免开放,而是采用其他方式来连接,比如配置隧道的方式。

image-20250529204038344


image-20250529204120904


确保列表中有添加的规则:

image-20250529204159836


验证程序


  1. 访问项目http://IP:Port/blog_login.html
    • IP 改为云服务器的 IP,Port 改为项目的端口号。
  2. 按照项目功能进行验证
    • 验证账号注册登录。image-20250529204225810
    • 验证展示博客列表。image-20250529204310510
    • 验证博客编辑功能image-20250529204430024
    • 验证新增博客。image-20250529204506265
    • 验证展示博客内容。image-20250529204453371

常见问题


一个程序的正常运行,需要程序的正确和环境的正确。同样的代码在 Windows 上可以运行成功,不一定在 Linux 上运行成功。不同的系统对代码的理解和支持是不同的。比如 Windows 系统对 MySQL 不区分大小写,Linux 区分大小写。

服务不能正常访问的原因有很多,主要分以下几个方面:

  1. 服务未启动

    • 使用 ps -ef | grep java 查看程序是否在运行。
    • 使用 curl http://127.0.0.1:8080/blog_login.html 看下是否有返回 HTML 页面。如果有返回,说明程序启动成功了,考虑端口未开放。
    • 如果未启动成功,需要查看对应的日志,根据原因来分析:
      • 数据库不存在。
      • 表不存在(区分大小写)。
      • 数据库密码不正确。
      • JDK 安装版本不对,或者未安装。
      • MySQL 未设置密码。
  2. HTTP 端口未开放

    • 检查云服务器防火墙/安全组是否开放相应端口(如 8080)。

杀掉进程

如果我们需要重启服务,或者重新部署等,都需要先停止之前的服务。

  1. 查看当前服务的进程

    ps -ef | grep java
    

    上图中的 35443 就是该服务的进程。

  2. 杀掉进程

    kill -9 PID
    

在这里插入图片描述

在这里插入图片描述


http://www.hkcw.cn/article/nvoMNaAlSA.shtml

相关文章

如何利用categraf的exec插件实现对Linux主机系统用户及密码有效期进行监控及告警?

需求描述 Categraf作为夜莺监控平台的数据采集工具&#xff0c;为了保障Linux主机的安全&#xff0c;需要实现对系统用户密码有效期的监控&#xff0c;并在密码即将到期时及时告警&#xff0c;以提醒运维人员更改密码。本章将详细介绍如何利用Categraf的exec插件来实现这一功能…

Houdini POP入门学习02

本篇继续随教程学习POP&#xff0c;并附带学习一些wrangle知识点等。 1.新建空项目&#xff0c;添加Geometry sphere小球。 2.连接popnet&#xff0c;现在粒子随小球形态发射 3.双击进入popnet&#xff0c;在wire_pops_into_here处连接popwind&#xff0c;添加风力 4.设置Wind…

《藏海传》平津侯被斩首!着实让人恨的牙痒痒

《藏海传》平津侯被斩首。藏海传演到今天,目前最大的反派就是平津侯,他霸道强势,杀人如麻,掌控许多人的命运,又有实力派演员黄觉演绎,着实让人恨的牙痒痒。平津侯名字庄芦隐,战功赫赫,他一副正义凛然不信鬼神之说的样子,其实并不是。他逼杀藏海父母,都知道是为了癸玺…

哪吒汽车总部LOGO被连夜拆除?公司回应!原CEO张勇名下超4000万股权被冻结 搬迁与股权冻结引关注

哪吒汽车上海总部外墙的“哪吒汽车”LOGO已被拆除,一同被拆除的还有位于总部的哪吒体验中心标志。据透露,拆除原因是场地到期,公司即将搬家。具体的新办公室地址尚未公布。哪吒汽车原CEO张勇名下股权被冻结,金额为4050万元,冻结期限从2025年5月13日至2028年5月12日。张勇是…

特朗普政府请求上诉法院暂停关税裁决 裁决暂时搁置

5月29日,美国联邦巡回上诉法院批准了特朗普政府的请求,暂时搁置了美国国际贸易法院此前做出的禁止执行依据《国际紧急经济权力法》对多国加征关税措施的裁决。联邦巡回上诉法院表示,在审议相关动议文件期间,美国国际贸易法院在这些案件中作出的判决和永久性禁令将暂时中止,…

禁招国际生案哈佛再获胜 美政府改立场

禁招国际生案哈佛再获胜 美政府改立场提出“30天限期”当地时间29日,美国马萨诸塞州联邦地区法院一名法官批准了哈佛大学提出的发布初步禁令请求,“叫停”特朗普政府取消哈佛大学招收外国学生资质的政策。该法院法官艾莉森伯勒斯29日就该案举行听证会。法院网站最新信息显示,…

中国对沙特等4国试行免签!欢迎说走就走的中国行

5月28日,外交部发言人毛宁主持例行记者会。有记者提问称,中方在东盟-中国-海合会峰会期间宣布对沙特等四国试行免签政策,希望了解具体情况。毛宁表示,为便利中外人员往来,中方决定扩大免签国家范围。自2025年6月9日至2026年6月8日,对沙特、阿曼、科威特、巴林持普通护照人…

【Unity基础】Unity新手实战教程:用ScriptableObject控制Cube颜色

目录 项目概述&#x1f6e0;️ 完整操作步骤&#xff08;10分钟内完成&#xff09;步骤1&#xff1a;创建ScriptableObject类步骤2&#xff1a;创建颜色配置资产步骤3&#xff1a;创建Cube控制器步骤4&#xff1a;设置场景和Cube步骤5&#xff1a;添加简单UI提示步骤6&#xff…

美宣布撤销中国留学生签证 我使馆:已提出严正交涉

美方宣布撤销中国留学生签证 我使馆:已提出严正交涉关于美国务院发表声明称将撤销有关中国在美留学生签证一事,中国驻美使馆发言人5月29日在回答媒体提问时表示,中方坚决反对美方这一政治性、歧视性做法。中国驻美使馆表示,美方此举将严重损害中国在美留学人员正当合法权益…

硅基计划2.0 学习总结 伍 类的继承 初稿

文章目录 一、 继承1. 为什么要继承2. 如何继承3. 情况一&#xff1a;子父类成员变量重名4. 情况二&#xff1a;子父类成员方法重名5. 子父类构造方法问题6. 继承中代码块调用顺序7. protected关键字7. 继承方式8. final关键字9. 继承和组合 一、 继承 1. 为什么要继承 假设一…

长安链合约操作 查询合约命令解析

这个命令使用 ChainMaker 的 cmc 客户端工具查询智能合约 fact 的 find_by_file_hash 方法&#xff0c;通过文件哈希值检索链上存储的数据。以下是详细解析&#xff1a; 命令功能 调用合约 fact 的 查询方法 find_by_file_hash&#xff0c;根据文件哈希值 ab3456df5799b87c77…

嵌入式开发之STM32学习笔记day15

STM32F103C8T6 USART串口协议 1 通信接口 通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统通信协议&#xff1a;制定通信的规则&#xff0c;通信双方按照协议规则进行数据收发 名称 引脚 双工 时钟 电平 设备 USART TX、RX 全双工 …

Java版本的VPN(wlcn)1.3.1-JDK17-SNAPSHOT

项目介绍 wu-lazy-cloud-network 是一款基于&#xff08;wu-framework-parent&#xff09;孵化出的项目&#xff0c;内部使用Lazy ORM操作数据库&#xff0c;主要功能是网络穿透&#xff0c;对于没有公网IP的服务进行公网IP映射 使用环境JDK17 Spring Boot 3.0.2 版本更新 1…

javaweb 前言

Web的发展历史 Web的诞生 (1989-1991)&#xff1a; 1989年&#xff0c;欧洲核子研究组织&#xff08;CERN&#xff09;的蒂姆伯纳斯-李提出了World Wide Web的概念&#xff0c;并发明了统一资源定位符&#xff08;URL&#xff09;、超文本传输协议&#xff08;HTTP&#xff09…

<el-date-picker>配置禁用指定日期之前的时间选择(Vue2+Vue3)

今天突然接受到一个离谱的需求&#xff1a;有一个需要配置定时任务开始执行时间的组件&#xff0c;之前的做法都是用<el-form>的rules定义校验规则&#xff0c;也能实现效果&#xff0c;但是今天产品突发奇想&#xff1a;不能选的时间就置灰&#xff08;就是我们说的禁用…

Redis 主从节点

Redis 主从节点的核心区别 特性主节点 (Master)从节点 (Slave/Replica)读写权限可读可写只读&#xff08;默认配置&#xff09;数据流向数据来源从主节点同步数据连接关系可连接多个从节点只能连接一个主节点故障切换故障时需要手动/自动提升从节点可被提升为新的主节点命令执…

[NOIP 2001 普及组] 数的计算 Java

import java.util.*;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();sc.close();int[] arr new int[n 1]; // 存储第i个数对应的合法数列数for (int i 1; i < n; i) {arr[i]; // 只有一个数n的数列…

【NATURE氮化镓】GaN超晶格多沟道场效应晶体管的“闩锁效应”

2025年X月X日,布里斯托大学的Akhil S. Kumar等人在《Nature Electronics》期刊发表了题为《Gallium nitride multichannel devices with latch-induced sub-60-mV-per-decade subthreshold slopes for radiofrequency applications》的文章,基于AlGaN/GaN超晶格多通道场效应晶…

Vue-Router 基础使用

Vue Router 是 Vue 官方的客户端路由解决方案。 客户端路由的作用是在单页应用 SPA 中将浏览器的 URL 和用户看到的内容绑定起来。当用户在应用中浏览不同页面时&#xff0c;URL 会随之更新&#xff0c;但页面不需要从服务器重新加载。 Vue Router 基于 Vue 的组件系统构建&a…

Linux服务器时间同步——Chronyd

需求&#xff1a;现有三台服务器&#xff0c;想要确保服务器间时间保持一致。 一、安装Chronyd 确认是否安装了chronyd服务 systemctl status chronyd 如果Linux系统中没有安装&#xff0c;可以通过如下命令进行安装&#xff1a; yum install chrony -y 注&#xff1a;确保…