一、项目环境是怎么划分的

原笔记给出的环境信息如下:

主机 角色
web01 (192.168.1.20) 前端(Nginx)+ 后端(JDK / Jar)
db02 (192.168.1.26) MySQL 8.0 二进制安装

项目名称是:

  • 学之思开源考试系统

部署目标可以拆成三部分:

1、数据库准备
2、后端 Java 服务启动
3、前端静态资源通过 Nginx 提供访问,并代理后端 API

二、MySQL 8.0 如何用二进制方式安装

原笔记先准备目录:

mkdir -p /app/tools/ /app/data/3306/
tar xf mysql-8.0.30-linux-glibc2.12-x86_64.tar.xz -C /app/tools/
ln -s /app/tools/mysql-8.0.30-linux-glibc2.12-x86_64/ /app/tools/mysql
yum install ncurses ncurses-devel libaio-devel openssl openssl-devel -y

这一步体现了二进制安装的典型思路:

  • 安装目录和数据目录分离
  • 用软链接简化版本管理

三、MySQL 基础配置怎么写

原笔记先创建数据库用户:

useradd -s /sbin/nologin -M mysql

然后写 /etc/my.cnf

[mysqld]
user=mysql
basedir=/app/tools/mysql/
datadir=/app/data/3306/
port=3306
socket=/tmp/mysql.sock

[client]
socket=/tmp/mysql.sock

接着调整权限并加 PATH:

chown mysql.mysql /etc/my.cnf
chown -R mysql.mysql /app/data/3306
echo 'export PATH=/app/tools/mysql/bin:$PATH' >> /etc/profile
source /etc/profile
mysql -V

四、MySQL 初始化和启动步骤是什么

原笔记使用了 --initialize-insecure 初始化:

mysqld --initialize-insecure --user=mysql \
--basedir=/app/tools/mysql/ --datadir=/app/data/3306/

然后用官方附带脚本接入系统服务:

cp /app/tools/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
systemctl enable mysqld
systemctl start mysqld

这个步骤完成后,数据库服务就可以用系统方式管理了。

五、考试系统业务库和账号怎么准备

原笔记在登录 MySQL 后创建了业务库和账号:

create database exam charset utf8mb4;
create user exam@'172.16.1.%' identified with mysql_native_password by '1';
grant all on exam.* to exam@'172.16.1.%';

然后通过:

mysql -uexam -p1 -h 172.16.1.26

验证远程连接。

原笔记随后还导入了项目 SQL:

mysql exam < xzs-mysql.sql

虽然示例里展示了大量表结构,但部署视角下最关键的是:

  • 业务库准备完成
  • 账号授权完成
  • 初始化数据导入完成

六、后端 Jar 服务如何部署

原笔记的后端包是:

  • xzs-3.9.0.jar

部署步骤如下:

mkdir -p /app/code/exam/{front,backend}
cd /app/code/exam/backend/
mv /root/xzs-3.9.0.jar .

同时还准备了 application-prod.yml,核心数据库配置如下:

spring:
  datasource:
    url: jdbc:mysql://172.16.1.26:3306/exam?useSSL=false&useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true&allowMultiQueries=true
    username: exam
    password: 1
    driver-class-name: com.mysql.cj.jdbc.Driver

启动方式:

java -Duser.timezone=Asia/Shanghai -Dspring.profiles.active=prod -jar xzs-3.9.0.jar

后台运行方式:

nohup java -Duser.timezone=Asia/Shanghai -Dspring.profiles.active=prod -jar xzs-3.9.0.jar > start11.log 2>&1 &

启动后检查:

ps -ef | grep java
ss -lntup | grep 8000

说明后端服务监听在:

  • 8000

七、如何先直接验证后端接口页面

原笔记先直接通过 IP + 端口访问后端:

  • http://192.168.1.20:8000/student
  • http://192.168.1.20:8000/admin

并用默认账号测试:

  • 学生:student / 123456
  • 管理员:admin / 123456

这一步的作用很关键,因为它先验证了:

  • Jar 能正常运行
  • 后端能连上数据库
  • 基础业务页面正常

八、前端静态资源如何部署到 Nginx

原笔记先解压前端包:

unzip exam-web-前端.zip
mv exam-web-前端/* /app/code/exam/front/

解压后可见两个目录:

  • admin
  • student

接着写 Nginx 配置:

server {
    listen 80;
    server_name shouye.oldboylinux.cn;
    root /app/code/exam/front/admin/;

    location / {
        index index.html;
    }

    location /api/ {
        proxy_pass http://localhost:8000;
    }
}

server {
    listen 80;
    server_name student.oldboylinux.cn;
    root /app/code/exam/front/student/;

    location / {
        index index.html;
    }

    location /api/ {
        proxy_pass http://localhost:8000;
    }
}

这份配置体现了前后端分离部署最典型的模式:

  • 不同域名对应不同前端静态资源目录
  • /api/ 路径统一反向代理到后端 Jar 服务

写完后重载:

systemctl reload nginx

九、最终联调怎么做

原笔记最后通过本地 hosts 加入:

192.168.1.20 shouye.oldboylinux.cn student.oldboylinux.cn

然后分别访问:

  • http://shouye.oldboylinux.cn/
  • http://student.oldboylinux.cn/

并继续用:

  • admin / 123456
  • student / 123456

做登录验证。

这一步说明整个项目的三层已经打通:

  • Nginx 前端静态资源
  • Java 后端接口服务
  • MySQL 业务数据库

十、小结

这个考试系统案例非常适合帮助理解前后端分离项目的标准落地路径:

  • MySQL 先初始化并导入业务数据
  • 后端 Jar 独立启动并监听 API 端口
  • 前端静态资源交给 Nginx
  • 前端通过 /api/ 去访问后端

对实际部署来说,这套模式已经非常接近很多企业内部 Java + Vue 项目的基本形态。