在 RHEL/CentOS/Rocky Linux 9.x 系统(目标主机 192.168.0.20)上,通过「JDK11+Maven3.9.6」编译 ZrLog 源码生成 War 包,搭配 MariaDB(数据库)+Tomcat10(应用容器)+Nginx(反向代理)完成部署,最终实现浏览器访问 ZrLog 博客系统。
源码 → Maven 构建(依赖下载 + 编译 + 打包)→ War 包 → Tomcat 部署 → Nginx 反向代理 → 浏览器访问;
一、前置环境准备(JDK+Maven+基础依赖)
1.1 安装并配置JDK11
- JDK 是 Java 开发工具包,提供编写、编译、调试 Java 代码所需的全部工具,面向开发者使用;
- JRE 是 Java 运行时环境,仅包含运行已编译 Java 程序的必要环境(JVM + 核心类库),仅运行Java程序时可只装JRE;
- JVM 是 Java 虚拟机,负责将 Java 字节码翻译成操作系统能执行的指令,是 Java 实现跨平台运行的核心(Java 代码编译后生成的不是操作系统能直接执行的机器码,而是通用的「字节码(.class 文件)」,不同操作系统安装对应的 JVM(Java 虚拟机),由 JVM 负责将字节码翻译成当前系统的机器指令)。
示例:
#上传 jdk-11.tar.gz 到 /root 目录,执行解压
[root@zrlog ~]# tar -zxf jdk-11_linux-x64_bin.tar.gz
[root@zrlog ~]# mv jdk-11 jdk11
#配置全局环境变量(永久生效)
[root@zrlog ~]# cat > /etc/profile.d/jdk.sh << 'EOF'
export JAVA_HOME=/root/jdk11
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib
EOF
#生效
[root@zrlog ~]# source /etc/profile.d/jdk.sh
测试:

1.2 安装 Maven + 配置阿里云镜像(关键优化)
#下载 Maven 3.9.6(适配JDK 11),解压并重命名
[root@zrlog ~]# tar -zxf apache-maven-3.9.14-bin.tar.gz
[root@zrlog ~]# mv apache-maven-3.9.14 maven
#配置全局环境变量
[root@zrlog ~]# cat > /etc/profile.d/maven.sh << 'EOF'
export MAVEN_HOME=/root/maven
export PATH=$MAVEN_HOME/bin:$PATH
EOF
[root@zrlog ~]# source /etc/profile.d/maven.sh
测试:

#修改仓库路径,以防限速而无法正常运行
[root@zrlog package]# vim /root/maven/conf/settings.xml
.....
<mirror>
<id>tencentmaven</id>
<mirrorOf>central</mirrorOf>
<url>https://maven.aliyun.com/repository/public/</url>
</mirror>
....

二、Maven 构建 ZrLog War 包(核心步骤)
pom.xml(Project Object Model,项目对象模型)是 Maven项目的"灵魂配置文件",用于定义项目的所有核心信息,是Maven构建、依赖管理、打包的唯一依据(实验中核心作用是解决"无War包""依赖下载"问题)。
2.1 解压 ZrLog 源码压缩包
[root@zrlog ~]# unzip -q zrlog-3.3.0-1811fd7-release.zip -d zrlog-src
[root@zrlog ~]# cd zrlog-src
2.2 定位 pom.xml 并执行构建
#进入pom.xml所在目录
[root@zrlog ~]# find /root/zrlog-src/ -name pom.xml
/root/zrlog-src/META-INF/maven/com.hibegin/package/pom.xml
#配置阿里云镜像(解决依赖下载慢/失败)
[root@zrlog ~]# mv /root/zrlog-src/META-INF/maven/com.hibegin/package/pom.xml /root/zrlog-src/META-INF/maven/com.hibegin/package/pom.xml.bak
# 写入全新的独立pom.xml(无需父POM,直接构建War包)
[root@zrlog ~]# cat > /root/zrlog-src/META-INF/maven/com.hibegin/package/pom.xml << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 手动定义项目基本信息(替代父POM) -->
<groupId>com.hibegin</groupId>
<artifactId>zrlog-web</artifactId>
<version>3.3.0</version>
<packaging>war</packaging>
<name>ZrLog Web</name>
<description>ZrLog Blog System</description>
<!-- 核心依赖(覆盖父POM的关键依赖) -->
<dependencies>
<!-- Servlet & JSP 核心 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<!-- Java EE 基础 -->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>8.0.1</version>
<scope>provided</scope>
</dependency>
<!-- 数据库驱动(ZrLog核心依赖) -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<!-- 日志依赖 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.13</version>
</dependency>
</dependencies>
<!-- 构建配置(确保能打出可运行的War包) -->
<build>
<finalName>zrlog</finalName>
<plugins>
<!-- 编译插件(适配JDK11) -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>11</source>
<target>11</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- War包插件(忽略缺失web.xml) -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<!-- 指向ZrLog的源码/资源目录(关键) -->
<webResources>
<resource>
<directory>/root/zrlog-src</directory>
<includes>
<include>WEB-INF/**/*</include>
<include>META-INF/**/*</include>
<include>**/*.jsp</include>
<include>**/*.html</include>
<include>**/*.css</include>
<include>**/*.js</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>
</plugins>
</build>
</project>
EOF
[root@zrlog ~]# cd /root/zrlog-src/META-INF/maven/com.hibegin/package/
#执行Maven打包(-DskipTests跳过测试,加快构建速度)
[root@zrlog package]# mvn clean package -DskipTests
构建成功标识:

三、安装数据库 / 反向代理 / 应用容器
3.1 基础工具依赖
[root@zrlog ~]# dnf install -y wget unzip tar vim net-tools
3.2 MariaDB 数据库部署
[root@zrlog ~]# dnf install -y mariadb-server mariadb
[root@zrlog ~]# systemctl start mariadb && systemctl enable mariadb
3.3 创建ZrLog专用库和用户
[root@zrlog ~]# mysql -u root -e "
CREATE DATABASE zrlog DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'zrlog'@'%' IDENTIFIED BY 'zrlog123456';
GRANT ALL PRIVILEGES ON zrlog.* TO 'zrlog'@'%';
FLUSH PRIVILEGES;
"
3.4 Nginx 反向代理部署
[root@zrlog ~]# dnf install -y nginx
# 写入优化配置
[root@zrlog ~]# cat > /etc/nginx/conf.d/zrlog.conf << 'EOF'
server {
listen 80;
server_name _;
charset utf-8;
client_max_body_size 100M;
# 反向代理Tomcat
location / {
#反向代理核心:转发请求到Tomcat的8080端口
proxy_pass http://127.0.0.1:8080;
#把用户请求中的 Host 头(比如用户访问的域名 / IP)传递给后端 Tomcat。
proxy_set_header Host $host;
#把真实的客户端 IP 传递给后端 Tomcat。
proxy_set_header X-Real-IP $remote_addr;
#传递 "IP 转发链",适配多层代理场景。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#设置 Nginx 与后端 Tomcat 建立连接的超时时间(60 秒)
proxy_connect_timeout 60s;
#设置 Nginx 等待后端 Tomcat 响应数据的超时时间(60 秒)。
proxy_read_timeout 60s;
}
}
EOF
# 启动并开机自启
[root@zrlog ~]# systemctl start nginx && systemctl enable nginx
[root@zrlog ~]# nginx -t # 验证配置无报错
3.5 Tomcat 9 部署
[root@zrlog ~]# tar -zxf apache-tomcat-10.1.52.tar.gz
[root@zrlog ~]# mv apache-tomcat-10.1.52 tomcat10
# 配置Tomcat内存参数
[root@zrlog ~]# cat > /root/tomcat10/bin/setenv.sh << 'EOF'
export JAVA_HOME=/root/jdk11
export CATALINA_OPTS="-Xms512m -Xmx1024m"
EOF
[root@zrlog ~]# chmod +x /root/tomcat10/bin/*.sh
配置这些环境变量,就是让系统和程序 "不用问、不用找",直接知道核心工具 / 依赖的位置,既能简化命令执行,也能避免版本冲突、路径错误等问题。
四、部署 War 包到 Tomcat
4.1 复制 War 包并清理旧数据
# 回到Maven构建目录
[root@zrlog ~]# cd /root/zrlog-src/META-INF/maven/com.hibegin/package/
# 复制War包到Tomcat webapps目录,重命名为ROOT.war(直接访问根路径)
[root@zrlog ~]# cp target/zrlog.war /root/tomcat10/webapps/ROOT.war
# 清理Tomcat旧解压文件(避免冲突)
[root@zrlog ~]# rm -rf /root/tomcat10/webapps/ROOT
4.2 启动 Tomcat 并验证
启动Tomcat:
[root@zrlog ~]# /root/tomcat10/bin/startup.sh

查看启动日志(确认War包解压、服务无报错):
[root@zrlog ~]# tail -f /root/tomcat10/logs/catalina.out

五、Web 端安装与访问
5.1 访问地址
http://172.25.254.20 (Nginx反向代理80端口,无需加8080)
5.2 安装向导配置(数据库信息)
| 配置项 | 取值 |
|---|---|
| 数据库地址 | 172.25.254.20 |
| 数据库端口 | 3306 |
| 数据库名 | zrlog |
| 数据库用户名 | zrlog |
| 数据库密码 | zrlog123456 |



六、常见问题
6.1 Maven 构建失败
| 问题现象 | 解决方案 |
|---|---|
| 依赖下载超时 / 失败 | 确认阿里云镜像配置生效(settings.xml 路径正确),或切换网络后重新构建 |
JAVA_HOME未配置 |
重新执行 source /etc/profile.d/jdk.sh,验证 java -version 输出正常 |
| 缺少编译依赖 | 执行 dnf install -y gcc-c++ make 安装编译工具后重新构建 |
6.2 Tomcat 启动后 404
| 问题现象 | 解决方案 |
|---|---|
| ROOT.war 未解压 | 检查catalina.out日志是否有解压错误,手动删除 War 包重新复制后重启 |
| 端口 8080 被占用 | netstat -tulpn | grep 8080 找到占用进程,kill后重启Tomcat |
| 数据库连接失败 | 确认 MariaDB 已启动,且 zrlog 用户允许远程连接(% 通配符) |
6.3 Nginx 无法访问
| 问题现象 | 解决方案 |
|---|---|
| 80端口未监听 | systemctl status nginx 查看状态,修复配置错误(nginx -t 验证) |
| 反向代理无响应 | 确认 Tomcat 已启动,且 proxy_pass 地址为 127.0.0.1:8080 无误 |