当前位置: 首页 > news >正文

前后端分离部署学之思在线考试系统

文章目录

  • 前后端分离部署学之思在线考试系统
    • 网站架构细节
      • 情况1:用户访问静态资源
      • 情况2:用户访问动态资源
    • 环境准备
      • (1)检查网络环境
      • (2)修改主机名
      • (3)配置时间同步
      • (4)添加hosts解析
    • 一、配置NFS
      • (1)nfs01安装nfs、rpcbind
      • (2)nfs01配置共享目录
      • (3)nfs01设置固定端口并开放端口
      • (4)前后端集群安装nfs
    • 二、编译源代码(前端、后端)
      • (1)下载node.js工具
      • (2)下载maven
      • (3)下载学之思源代码
    • 三、配置数据库(db01)
      • (1)安装mysql8.4
      • (2)创建库和用户并导入数据
      • (3)jar包启动测试(编译机)
    • 四、配置后端集群
      • (1)web03,web04安装jdk8
      • (2)将编译包传输到web03、web04并编写启动脚本
      • (2)lb01、lb02安装nginx,并接入4层负载
      • (3)lb01、lb02接入keepalived单主架构
      • (4)测试访问后端
    • 七、配置前端集群
      • (1)web01、web02安装nginx
      • (2)web01、web02配置站点目录和站点配置文件
      • (3)lb01、lb02接入前端7层负载
      • (4)lb01、lb02接入keepalived单主架构
      • (5)测试访问前端
    • 八、前端集群接入https
      • (1)前端七层负载
      • (2)前端web站点配置文件
      • (3)测试访问

前后端分离部署学之思在线考试系统

image-20251106172835872

网站架构细节

情况1:用户访问静态资源

情况1:用户访问静态资源(如图片、CSS、JS 文件)

(1)用户浏览器优先检查本地是否有缓存的静态资源,若有则直接使用

(2)若浏览器无缓存,请求先到CDN 节点。CDN 会判断自身是否缓存了该静态资源:

  • 若有,直接返回给用户,加速访问
  • 若没有,继续向后端请求

(3)请求经过防火墙,到达负载均衡

(4)负载均衡将请求转发给后端 Nginx 服务器,Nginx 监听 80 端口并匹配域名

  • 匹配成功:转发到对应站点处理(通过Host头、X-Forwarded-For头标识请求来源);
  • 匹配失败:走默认站点或拒绝请求

(5)前端web集群处理

  • Nginx 在站点内匹配location规则,识别静态资源请求后,直接返回资源文件,并设置expires头(控制浏览器缓存时长);
  • 若域名匹配失败,走默认站点处理或拒绝请求。

(6)资源返回:处理完成后,静态资源从 Web 节点经负载均衡返回给用户,完成访问

情况2:用户访问动态资源

情况 2:用户访问动态资源(如登录、添加题、给题添加图片、发题)

(1)负载均衡算法:前端集群通过负载均衡算法(如轮询、权重)分配请求,确保流量均匀

(2)Nginx 路由匹配:Nginx 监听 80 端口并匹配域名:

  • 匹配成功:转发到对应站点处理(通过Host头、X-Forwarded-For头标识请求);
  • 匹配失败:走默认站点(或拒绝请求)

4

(3)Web 节点的动态请求处理:

  • 负载均衡算法:Web 节点集群(多台 Tomcat 服务器)通过负载均衡算法(如轮询、权重、IP 哈希)分配请求,避免单节点压力过大,确保流量均匀分发。
  • Nginx 流程:Nginx 匹配站点内的location规则,识别以.jsp.do.action或无后缀的 REST 接口等 Java 动态请求后,将请求转发到 Tomcat 服务的8080端口(默认端口,可自定义)。转发时会携带HostX-Real-IP等头信息,确保 Tomcat 正确识别请求来源。
  • Java 解析与业务处理:Tomcat 作为 Servlet 容器,接收请求后解析 JSP、执行 Servlet 或 Spring Boot 应用的业务逻辑:
    • 若涉及数据库操作(如查询用户信息、提交订单),通过 JDBC、MyBatis 或 JPA 等框架连接数据库执行 CRUD 操作;
    • 若涉及用户登录 / 会话管理,通过Spring Session + RedisTomcat-Redis Session 管理器读写会话信息,实现分布式环境下的会话共享;
    • 处理完成后,Tomcat 将响应结果返回给 Nginx,再由 Nginx 转发给用户。
  • 若域名匹配失败或站点内location规则未命中动态请求,请求将路由至默认站点处理(如返回 404 页面)。

(4)资源返回:处理完成后,响应经负载均衡返回给用户,完成动态操作

环境准备

角色主机名IP操作系统
nginx+keepalivedlb0110.0.0.106/172.16.1.106KylinV10SP3
nginx+keepalivedlb0210.0.0.107/172.16.1.107KylinV10SP3
nginxweb0110.0.0.103/172.16.1.103KylinV10SP3
nginxweb0210.0.0.104/172.16.1.104KylinV10SP3
nginx+tomcatweb0310.0.0.108/172.16.1.108KylinV10SP3
nginx+tomcatweb0410.0.0.109/172.16.1.109KylinV10SP3
nfsnfs0110.0.0.102/172.16.1.102KylinV10SP3
mysql+redisdb0110.0.0.105/172.16.1.105KylinV10SP3
编译代码---

(1)检查网络环境

#1.检查网段情况
检查10网段是否能够上网
检查内网172网段 #是否能互通

(2)修改主机名

hostnamectl set-hostname web01
hostnamectl set-hostname web02
hostnamectl set-hostname web03
hostnamectl set-hostname web04
hostnamectl set-hostname lb01
hostnamectl set-hostname lb02
hostnamectl set-hostname db01
hostnamectl set-hostname nfs01

(3)配置时间同步

yum install -y ntpdate
echo "*/3 * * * * root bash ntpdate ntp.aliyun.com >/dev/null 2>&1" >> /etc/crontab

(4)添加hosts解析

SSH 服务默认会对 客户端 IP 做反向 DNS 解析(验证 IP 对应的域名是否合法),若服务器 DNS 配置错误、解析超时,或客户端 IP 无反向解析记录,会导致登录卡在 “等待解析” 环节,延迟通常 5-30 秒

#1.注释掉已有的配置
sed -i '/^GSSAPIAuthentication/s@^@#@g' /etc/ssh/sshd_config
#2.关闭对应功能
#关闭dns反向解析  ip-->域名
cat >>/etc/ssh/sshd_config<<EOF
UseDNS no
GSSAPIAuthentication no
EOF
#2.重启sshd(在本地连接重启)
systemctl restart sshd
egrep '^(GSSAPIAuthentication|UseDNS)' /etc/ssh/sshd_config
#2.写入域名解析
cat >> /etc/hosts <<'EOF'
172.16.1.102 nfs01
172.16.1.103 web01
172.16.1.104 web02
172.16.1.108 web03
172.16.1.109 web04
172.16.1.105 db01
172.16.1.106 lb01
172.16.1.107 lb02
EOF

一、配置NFS

(1)nfs01安装nfs、rpcbind

#1.nfs01安装nfs
yum install -y nfs-utils
#2.并设置开机自启动(注意启动顺序)
systemctl enable --now rpcbind && systemctl enable --now nfs
#3.查看端口开放情况
[root@nfs01 ~]# rpcinfo -pprogram vers proto   port  service100000    4   tcp    111  portmapper100000    3   tcp    111  portmapper100000    2   tcp    111  portmapper100000    4   udp    111  portmapper100000    3   udp    111  portmapper100000    2   udp    111  portmapper100024    1   udp  53399  status100024    1   tcp  44459  status100005    1   udp  20048  mountd100005    1   tcp  20048  mountd100005    2   udp  20048  mountd100005    2   tcp  20048  mountd100005    3   udp  20048  mountd100005    3   tcp  20048  mountd100003    3   tcp   2049  nfs100003    4   tcp   2049  nfs100227    3   tcp   2049  nfs_acl100021    1   udp  51356  nlockmgr100021    3   udp  51356  nlockmgr100021    4   udp  51356  nlockmgr100021    1   tcp  33249  nlockmgr100021    3   tcp  33249  nlockmgr100021    4   tcp  33249  nlockmgr

(2)nfs01配置共享目录

#1.设置共享目录
cat > /etc/exports <<EOF
/data 172.16.1.0/24(rw,all_squash,anonuid=1999,anongid=1999)
EOF
#2.创建共享目录的用户
groupadd -g 1999 www
useradd -u 1999 -g www -M -s /sbin/nologin www
#3.创建共享目录data
mkdir /data
#4.给data目录属主和属组设置为www
chown -R www:www /data/
#5.生效共享目录配置
exportfs -arv
#6.查看共享目录
showmount -e localhost 

(3)nfs01设置固定端口并开放端口

#1.设置nfs固定端口,并防火墙放行端口
cat >> /etc/sysconfig/nfs <<EOF
RQUOTAD_PORT=875
LOCKD_TCPPORT=32803
LOCKD_UDPPORT=32769
MOUNTD_PORT=892
STATD_PORT=662
EOF
#2.给lockd、statd设置端口(修改如下设置)
vim /etc/nfs.conf
[lockd]port=32803udp-port=32769[statd]port=662
#3.重启相关服务
systemctl restart rpcbind && systemctl restart nfs && systemctl restart nfs-lock
#4.查看端口是否固定
[root@nfs01 ~]# rpcinfo -pprogram vers proto   port  service100000    4   tcp    111  portmapper100000    3   tcp    111  portmapper100000    2   tcp    111  portmapper100000    4   udp    111  portmapper100000    3   udp    111  portmapper100000    2   udp    111  portmapper100005    1   udp  20048  mountd100005    1   tcp  20048  mountd100005    2   udp  20048  mountd100005    2   tcp  20048  mountd100005    3   udp  20048  mountd100005    3   tcp  20048  mountd100003    3   tcp   2049  nfs100003    4   tcp   2049  nfs100227    3   tcp   2049  nfs_acl100021    1   udp  32769  nlockmgr100021    3   udp  32769  nlockmgr100021    4   udp  32769  nlockmgr100021    1   tcp  32803  nlockmgr100021    3   tcp  32803  nlockmgr100021    4   tcp  32803  nlockmgr100024    1   udp    662  status100024    1   tcp    662  status
#5.放行端口
cat > open_port.sh <<'EOF'
#!/bin/bash
##############################################################
# File Name:open_port.sh
# Version:V1.0
# Author:csq
# Organization: www.chenshiquan.xyz
# Desc:
##############################################################no_open_port=`rpcinfo -p |awk 'NR>1{print $(NF-1)}' | sort | uniq`
for i in ${no_open_port}
doopen_port=`firewall-cmd --list-all | grep $i | wc -l`if [ ${open_port} -eq 0 ];thenif firewall-cmd --add-port=$i/tcp --permanent >/dev/null 2>&1;thenecho "端口$i放行成功"elseecho "端口放行失败"fielseecho "端口$i已经放行"fi
done
firewall-cmd --reload >/dev/null 2>&1
firewall-cmd --list-all
EOF#6.执行放行端口脚本
[root@nfs01 ~]# bash open_port.sh 
端口111放行成功
端口20048放行成功
端口2049放行成功
端口34801放行成功
端口44395放行成功
端口662放行成功
public (active)target: defaulticmp-block-inversion: nointerfaces: ens33 ens34sources: services: cockpit dhcpv6-client mdns sshports: 111/tcp 20048/tcp 2049/tcp 34801/tcp 44395/tcp 662/tcpprotocols: masquerade: noforward-ports: source-ports: icmp-blocks: rich rules: 

(4)前后端集群安装nfs

#1.现在仅安装(后续用户挂载用户上传图片的目录)
yum install -y nfs-utils
#2.查看共享目录
showmount -e nfs01

二、编译源代码(前端、后端)

学之思gitee仓库:https://gitee.com/mindskip/xzs-mysql

学之思github仓库:https://github.com/mindskip/xzs-mysql

node.js官网:https://nodejs.org/zh-cn/download

学之思项目部署官方文档:https://www.mindskip.net:999/guide/deploy.html

(1)下载node.js工具

#1.安装编译依赖
yum install -y gcc-c++ make wget
#2.部署node.js工具
wget https://nodejs.org/dist/v16.20.2/node-v16.20.2-linux-x64.tar.xz -P /download
#3.解压到/usr/local/目录下
tar -xf /download/node-v16.20.2-linux-x64.tar.xz -C /usr/local/
#4.设置软链接简化路径
ln -s /usr/local/node-v16.20.2-linux-x64/ /usr/local/node
#5.修改node.js软件包所有者默认是(1001)
chown  -R root:root /usr/local/node-v16.20.2-linux-x64/
#6.配置node PATH环境变量
echo 'export PATH=$PATH:/usr/local/node/bin' >> /etc/profile
source  /etc/profile
#7.配置npm国内下载源
npm config set registry https://registry.npmmirror.com
cat ~/.npmrc  #源存放路径
#8.检查node.js版本和npm版本
npm --version && node --version

(2)下载maven

jdk安装:部署Tomcat11(Kylinv10sp3、Ubuntu2204、Rocky9.3)_ubuntu部署tomcat11-CSDN博客

#1.安装jdk21
yum install -y wget ; mkdir -p /download ; wget https://download.java.net/java/GA/jdk21.0.2/f2283984656d49d69e91c558476027ac/13/GPL/openjdk-21.0.2_linux-x64_bin.tar.gz -O /download/openjdk-21.0.2_linux-x64_bin.tar.gz
#解压并链接到/usr/local/jdk21
tar -zxvf /download/openjdk-21.0.2_linux-x64_bin.tar.gz -C /usr/local/
ln -s /usr/local/jdk-21.0.2 /usr/local/jdk21
#配置jdk环境变量
echo 'export JAVA_HOME=/usr/local/jdk21' >> /etc/profile
echo 'export PATH=${PATH}:$JAVA_HOME/bin' >> /etc/profile
source  /etc/profile#2.安装maven软件包
yum install -y wget;wget https://dlcdn.apache.org/maven/maven-3/3.9.11/binaries/apache-maven-3.9.11-bin.tar.gz -P /download#3.解压maven二进制包
tar -zxvf /download/apache-maven-3.9.11-bin.tar.gz -C /usr/local/#4.设置软链接简化路径
ln -s /usr/local/apache-maven-3.9.11/ /usr/local/maven#5.配置环境变量,并查看maven版本
echo 'export PATH=$PATH:/usr/local/maven/bin' >> /etc/profile
source  /etc/profile
mvn --version#6.配置maven编译加速
#mvn编译本质下载代码需要的jar包依赖,整合依赖生成war包/jar包
#mvn默认从官网下载,速度很慢
#配置maven阿里云加速
#打开 Maven 的配置文件(在maven安装目录的conf/settings.xml)
#在<mirrors></mirrors>标签中添加 mirror 子节点:
<mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>阿里云公共仓库</name><url>https://maven.aliyun.com/repository/public</url>
</mirror>

(3)下载学之思源代码

前端编译

#1.下载学之思源代码
wget https://gitee.com/mindskip/xzs-mysql/repository/archive/master.zip -P /download
#2.解压到当/download目录下
unzip /download/master.zip -d /download/
#3.进入到学之思前端vue目录中
cd /download/xzs-mysql-master/source/vue/ && ll
##发现有两个目录分开编译
drwxr-xr-x 4 root root 4096 Nov  6 10:19 xzs-admin
drwxr-xr-x 4 root root 4096 Nov  6 10:19 xzs-student
#4.分别打开文件夹打开源代码/source/vue/xzs-student和source/vue/xzs-admin
#执行下面2个命令,下载项目的node_module
cd xzs-student/
cd xzs-admin/
npm config set sass_binary_site https://registry.npmmirror.com
npm install --registry https://registry.npmmirror.com
#5.打包命令
npm run build
#6.打包后的目录为student和admin,将代码复制到/app/code/下
mkdir -p /app/code/
cp -rf admin/ /app/code/
cp -rf student/ /app/code/

后端编译

#1.将编译好的前端文件放到\source\xzs\src\main\resources\static下,然后将java程序打包成jar包
#编译jar包(找到源代码目录下的pom.xml,cd到改目录下编译jar包)
find /download/xzs-mysql-master/ -name pom.xml
#找到后进入编译目录编译jar包
cd /download/xzs-mysql-master/source/xzs/
#mvn编译jar包
mvn clean package
#2.将编译的jar包和yml配置文件,移动到/app/coed/java目录下
mkdir /app/code/java
mv target/{xzs-3.9.0.jar,classes/application-prod.yml} /app/code/java/

三、配置数据库(db01)

(1)安装mysql8.4

部署MySql8.4.6(Kylinv10sp3、Ubuntu2204、Rocky9.3)_银河麒麟服务器版yum装mysql8.4.6-CSDN博客

#1.下载源到本地并安装
mkdir -p /download ;yum install -y wget && cd /download ; wget https://dev.mysql.com/get/mysql84-community-release-el7-2.noarch.rpm && yum localinstall -y mysql84-community-release-el7-2.noarch.rpm
#2.安装
yum install -y mysql-community-server
#3.开启mysql
systemctl enable mysqld --now
#4.防火墙放行3306
firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --reload
#5.从日志中获取登陆密码
grep -i password /var/log/mysqld.log
#6.登录mysql修改密码,登录密码就是日志中获取的登录密码,复制粘贴即可登录
mysql -uroot -p
#7.进入数据库后修改密码,不修改密码啥也做不了
alter user 'root'@'localhost' identified by 'Abc@1234';
#8.再次登录mysql,测试修改密码是否成功
mysql -uroot -pAbc@1234

(2)创建库和用户并导入数据

#1.安装完毕并设置完root密码后,并放行数据库的3306端口
#登陆mysql
mysql -uroot -pAbc@1234
#2.创建xzs数据库
create database xzs charset utf8mb4;
#3.创建xzs用户并授权它只能从本地和内网登陆
create user xzs@'172.16.1.%' identified with caching_sha2_password by 'Abc@1234';
create user xzs@'localhost' identified with caching_sha2_password by 'Abc@1234';
#查看用户是否创建成功
SELECT user, host FROM mysql.user;
#4.将xzs用户授权xzs库
GRANT ALL  ON xzs.* TO 'xzs'@'localhost';
GRANT ALL  ON xzs.* TO 'xzs'@'172.16.1.%';
#查看是否授权成功
SELECT user, host FROM mysql.user WHERE user = 'xzs';
#登陆测试
mysql -uxzs -pAbc@1234#5.下载学之思数据库脚本,并进行导入
wget https://www.mindskip.net/sql/xzs-sql-v3.9.0.zip -P /download/
unzip /download/xzs-sql-v3.9.0.zip -d /download/
mysql -uroot -pAbc@1234 xzs < /download/xzs-mysql.sql
##备份数据库
#导出数据库所有数据: mysqldump -uroot -pAbc@1234 --all-databases  > all.sql
#导入数据库数据:mysql -uroot -pAbc@1234 < all.sql
#更新权限信息 因为导入的库中包含 mysql.user表权限信息: mysql -uroot -pAbc@1234 -e 'flush privileges;'

(3)jar包启动测试(编译机)

#1.在编译机中,修改application-prod.yml,添加数据库信息
cat > /app/code/java/application-prod.yml <<'EOF'
#server后端服务的配置
server:port: 8000undertow:io-threads: 16worker-threads: 4000    buffer-size: 1024direct-buffers: truecompression:enabled: truemin-response-size: 1
#日志
logging:path: /app/code/java/log/#数据库,redis等等配置
spring:datasource:#mysql://数据库地址:端口号/库名字?url: jdbc:mysql://172.16.1.105:3306/xzs?useSSL=false&useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true&allowMultiQueries=trueusername: xzspassword: Abc@1234driver-class-name: com.mysql.cj.jdbc.Driver
EOF#2.执行下列命令,运行程序
cd /app/code/java/
nohup java -Duser.timezone=Asia/Shanghai -jar -Dspring.profiles.active=prod  xzs-3.9.0.jar  > start1.log  2>&1 &#3.放行8000端口
firewall-cmd --add-port=8000/tcp --permanent
firewall-cmd --reload#4.浏览器访问
#学生端访问地址为:http://ip:8000/student
#管理员端访问地址为:http://ip:8000/admin

学生端,账号student密码123456

image-20251106164431460

管理端,账号admin密码123456

image-20251106164501627

#测试完成,结束该程序进程
ps -ef |grep xzs
#结束该服务进程
kill 5584

四、配置后端集群

(1)web03,web04安装jdk8

yum install -y java-1.8.0-openjdk

(2)将编译包传输到web03、web04并编写启动脚本

#1.web03,web04创建站点目录
mkdir -p /app/code/
#2.编译机器传输jar包和配置文件到web03,web04
[root@by01 ~]# cd /app/code/
[root@by01 /app/code]# scp -r java/ 10.0.0.109:`pwd`
[root@by01 /app/code]# scp -r java/ 10.0.0.108:`pwd`
#3.在web03、web04编写启动脚本
cat > /server/scripts/xzsbackend.sh <<'EOF'
#!/bin/bash
#############################################################################
# File Name: /server/scripts/xzsbackend.sh
# Version: V1.0
# Author: csq
# Organization: blog.chenshiquan.xyz
# Desc: 学之思启动脚本
#############################################################################
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/jdk21/bin:/usr/local/maven/bin:/root/bin#1. 核心变量(仅保留与你的启动命令相关的配置)
service=xzs-3.9.0.jar               # 你的jar包名称
dir=/app/code/java/              # jar包存放目录(请根据实际路径修改)
choose=$1                           # 命令参数(start/stop/restart/status)
log_file=${dir}start1.log           # 日志文件(与你的命令输出一致)
time=`date +%F_%T`
# Java启动参数(完全匹配你的命令)
java_opts="-Duser.timezone=Asia/Shanghai -Dspring.profiles.active=prod"#2. 日志函数
function logsng() {echo "$*" >> ${log_file}
}#3. 启动服务(完全对齐你的命令)
function srv_start() {# 目录检查if [ ! -d "${dir}" ]; thenlogsng "start [Failed] [${time}] 目录 ${dir} 不存在"echo "错误:目录 ${dir} 不存在"return 1fi# jar文件检查if [ ! -f "${dir}${service}" ]; thenlogsng "start [Failed] [${time}] 文件 ${dir}${service} 不存在"echo "错误:文件 ${dir}${service} 不存在"return 1fi# 检查是否已运行pid=$(ps -ef | grep -w "${service}" | grep -v grep | awk '{print $2}')if [ -z "${pid}" ]; thencd ${dir} || return 1  # 切换到jar包目录# 执行你的启动命令(无多余参数)java ${java_opts} -jar ${service} > ${log_file}# 检查启动结果if [ $? -eq 0 ]; thenlogsng "start [OK] [${time}] ${service} 启动成功"echo "${service} 启动成功,日志:${log_file}"elselogsng "start [Failed] [${time}] ${service} 启动失败"echo "${service} 启动失败,查看日志:${log_file}"fielselogsng "start [Failed] [${time}] ${service} 已运行(pid: ${pid})"echo "${service} 已运行(pid: ${pid})"fi
}#4. 停止服务
function srv_stop() {pid=$(ps -ef | grep -w "${service}" | grep -v grep | awk '{print $2}')if [ -n "${pid}" ]; thenkill -9 ${pid}if [ $? -eq 0 ];thenlogsng "stop [OK] [${time}] ${service} 停止成功(pid: ${pid})"echo "${service} 停止成功(pid: ${pid})"elselogsng "stop [Failed] [${time}] ${service} 停止失败(pid: ${pid})"echo "${service} 停止失败"fielselogsng "stop [Failed] [${time}] ${service} 未运行"echo "${service} 未运行"fi
}#5. 重启服务
function srv_restart() {echo "正在重启 ${service}..."logsng "restart [Info] [${time}] 开始重启 ${service}"srv_stopsleep 2  # 等待进程退出srv_start
}#6. 查看状态
function srv_status() {pid=$(ps -ef | grep -w "${service}" | grep -v grep | awk '{print $2}')pid_cnt=$(ps -ef | grep -w "${service}" | grep -v grep | wc -l)if [ ${pid_cnt} -ge 1 ];thenecho "running [OK] - ${service}(pid: ${pid}),日志:${log_file}"logsng "status [OK] [${time}] ${service} 运行中(pid: ${pid})"elseecho "stopped [Failed] - ${service} 未运行"logsng "status [Failed] [${time}] ${service} 未运行"fi
}#7. 命令分发
case "$choose" instart)    srv_start   ;;stop)     srv_stop    ;;restart)  srv_restart ;;status)   srv_status  ;;*)        echo "用法:$0 {start|stop|restart|status}" ;;
esac
EOF#4.配置systemctl
cat > /usr/lib/systemd/system/xzsbackend.service <<EOF
[Unit]
Description=xzsbackend
After=network.target
[Service]
Type=simple
#EnvironmentFile=/etc/sysconfig/tomcat
ExecStart=/bin/bash /server/scripts/xzsbackend.sh start
ExecStop=/bin/bash /server/scripts/xzsbackend.sh stop
[Install]
WantedBy=multi-user.target
EOF#5.设置开机自启动并开启服务,查看状态
systemctl daemon-reload && systemctl enable --now xzsbackend && systemctl status xzsbackend#6.放行8000端口
firewall-cmd --add-port=8000/tcp --permanent
firewall-cmd --reload

(2)lb01、lb02安装nginx,并接入4层负载

#1.配置源
cat > /etc/yum.repos.d/nginx.repo <<'EOF'
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/8/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/8/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
#2.安装nginx
yum install -y nginx-1:1.28.0-1.el8.ngx.x86_64
#3.启动nginx
systemctl enable --now nginx.service
systemctl is-active nginx.service
#4.防火墙放行80端口firewall-cmd --add-port=80/tcp --permanent 
firewall-cmd --reload
#5.lb01和lb02接入4层负载
##在nginx主配置文件中添加如下内容
stream {log_format l4 '$remote_addr [$time_local] "$protocol" ''$status $bytes_sent $bytes_received $session_time ';upstream  xzs_group {hash $remote_addr consistent;server 10.0.0.108:8000;server 10.0.0.109:8000;}server {listen 8000;access_log /var/log/nginx/access-xzs.chenshiquan.log l4;error_log /var/log/nginx/error-xzs.chenshiquan.log notice;proxy_pass xzs_group;}
}
#检查nginx语法
nginx -t
#重新加载nginx配置文件
systemctl reload nginx
#放行8000端口
firewall-cmd --add-port=8000/tcp --permanent
firewall-cmd --reloa

(3)lb01、lb02接入keepalived单主架构

  • lb01备节点
  • lb02主节点
#1.安装keepalived
yum install -y keepalived
#2.修改keepalived配置文件
#lb01
cat > /etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived
global_defs {router_id lb01
}
vrrp_instance VI_2 { state BACKUPinterface ens33virtual_router_id 67priority 50advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {10.0.0.10/24 dev ens33 label ens33:1}
}
EOF#lb02
cat > /etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived
global_defs {router_id lb02
}
vrrp_instance VI_2 {state MASTER interface ens33virtual_router_id 67 priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {10.0.0.10/24 dev ens33 label ens33:1}
}
EOF#3.设置keepalived开机自启并启动keepalived
systemctl enable --now  keepalived#4.两边放行vrrp协议
firewall-cmd --add-protocol=vrrp --permanent
firewall-cmd --reload#lb02查看使用有VIP
[root@lb02 ~]# hostname -I
10.0.0.107 10.0.0.10 172.16.1.107 

(4)测试访问后端

10.0.0.10:8000

前端页面和后端页面

image-20251108143527288

image-20251108143547582

七、配置前端集群

(1)web01、web02安装nginx

部署Nginx1.28(Kylinv10sp3、Ubuntu2204、Rocky9.3)_kylin 10sp3安装nginx教程-CSDN博客

#1.配置源
cat > /etc/yum.repos.d/nginx.repo <<'EOF'
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/8/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/8/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
#2.安装nginx
yum install -y nginx-1:1.28.0-1.el8.ngx.x86_64
#3.启动nginx
systemctl enable --now nginx.service
systemctl is-active nginx.service
#4.防火墙放行80端口firewall-cmd --add-port=80/tcp --permanent 
firewall-cmd --reload

(2)web01、web02配置站点目录和站点配置文件

#1.复制前端站点文件web01,web02的/app/code/frontend
##web01,web02创建站点目录
mkdir -p /app/code/frontend
#复制
[root@by01 ~]# cd /app/code/
[root@by01 /app/code]# scp -r admin/ student/ 10.0.0.103:/app/code/frontend/
[root@by01 /app/code]# scp -r admin/ student/ 10.0.0.104:/app/code/frontend#2.web01,web02创建站点文件
cat > /etc/nginx/conf.d/xzs.chenshiquan.xyz.conf <<'EOF'
server {listen 80;server_name admin.chenshiquan.xyz;root /app/code/frontend/admin/;location / {index index.html;}location /api {proxy_pass http://10.0.0.10:8000;}
}
server {listen 80;server_name student.chenshiquan.xyz;root /app/code/frontend/student;location / {index index.html;}location /api {proxy_pass http://10.0.0.10:8000;}
}
EOF#3.检查nginx语法
nginx -t
#4.重新加载nginx配置文件
systemctl reload nginx

(3)lb01、lb02接入前端7层负载

cat > /etc/nginx/conf.d/xzs.chenshiquan.xyz.conf <<'EOF'
upstream slb_7 {hash $remote_addr consistent;server 10.0.0.103:80;server 10.0.0.104:80;
}
server {listen 80;server_name admin.chenshiquan.xyz;location / {proxy_pass http://slb_7;proxy_set_header Host $http_host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Real-Ip $remote_addr;}
}
server {listen 80;server_name student.chenshiquan.xyz;location / {proxy_pass http://slb_7;proxy_set_header Host $http_host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Real-Ip $remote_addr;}
}
EOF
#检查nginx语法
nginx -t
#重新加载nginx配置文件
systemctl reload nginx

(4)lb01、lb02接入keepalived单主架构

lb01前端负载的master节点,lb02是后端负载的master节点,即keepalived双主架构

#lb01
cat >> /etc/keepalived/keepalived.conf <<'EOF'
! Configuration File for keepalived
global_defs {router_id lb01
}
vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 66priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {10.0.0.5/24 dev ens33 label ens33:0}
}
EOF
#lb02
cat >> /etc/keepalived/keepalived.conf <<'EOF'
! Configuration File for keepalived
global_defs {router_id lb02
}
vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 66 priority 50advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {10.0.0.5/24 dev ens33 label ens33:0}
}
EOF
#重启keepalived服务
systemctl restart keepalived

(5)测试访问前端

windows添加hosts解析 10.0.0.5 student.chenshiquan.xyz

八、前端集群接入https

  • 阿里云申请免费证书
  • 下载证书到本地,解压到/etc/nginx/keys

(1)前端七层负载

upstream slb_7 {
hash $remote_addr consistent;
server 10.0.0.103:443;
server 10.0.0.104:443;
}
server {listen 443 ssl;server_name admin.chenshiquan.xyz;ssl_certificate /etc/nginx/keys/admin.chenshiquan.xyz.pem;ssl_certificate_key /etc/nginx/keys/admin.chenshiquan.xyz.key;ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5:!aNULL:!eNULL:!EXPORT:!IDES:!RC4:!MD5;ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;ssl_session_cache shared:SSL:10m;ssl_session_timeout 10m;location / {proxy_pass https://slb_7;proxy_set_header Host $http_host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Real-Ip $remote_addr;}
}
server {listen 443 ssl;server_name student.chenshiquan.xyz;ssl_certificate /etc/nginx/keys/student.chenshiquan.xyz.pem;ssl_certificate_key /etc/nginx/keys/student.chenshiquan.xyz.key;ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5:!aNULL:!eNULL:!EXPORT:!IDES:!RC4:!MD5;ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;ssl_session_cache shared:SSL:10m;ssl_session_timeout 10m;location / {proxy_pass https://slb_7;proxy_set_header Host $http_host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Real-Ip $remote_addr;}
}#重新加载nginx服务
systemctl reload nginx

(2)前端web站点配置文件

server {listen 443 ssl;server_name admin.chenshiquan.xyz;ssl_certificate /etc/nginx/keys/admin.chenshiquan.xyz.pem;ssl_certificate_key /etc/nginx/keys/admin.chenshiquan.xyz.key;ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5:!aNULL:!eNULL:!EXPORT:!IDES:!RC4:!MD5;ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;ssl_session_cache shared:SSL:10m;ssl_session_timeout 10m;root /app/code/frontend/admin/;location / {index index.html;}location /api {proxy_pass http://10.0.0.10:8000;}
}
server {listen 443 ssl;server_name student.chenshiquan.xyz;ssl_certificate /etc/nginx/keys/student.chenshiquan.xyz.pem;ssl_certificate_key /etc/nginx/keys/student.chenshiquan.xyz.key;ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5:!aNULL:!eNULL:!EXPORT:!IDES:!RC4:!MD5;ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;ssl_session_cache shared:SSL:10m;ssl_session_timeout 10m;root /app/code/frontend/student;location / {index index.html;}       location /api {proxy_pass http://10.0.0.10:8000;}               
}   

(3)测试访问

访问https://admin.chenshiquan.xyz

image-20251115190738001

访问https://student.chenshiquan.xyz

image-20251115190822214

http://www.dtcms.com/a/613880.html

相关文章:

  • 在树莓派4B上部署ONNX格式的YOLOv8-Pose
  • websocket和传统socket有何差别?是属于一个子集还是完全不同?
  • 双指针问题2(c++)
  • 龙岩市城乡规划建设局网站三只松鼠的网络营销方式
  • Docker容器使用手册——入门篇(上)
  • C语言编译器网页版 | 轻松编写与调试C语言程序
  • QT注册自定义类相关的两个用法
  • 进程间关系(linux)
  • WordPress外贸成品网站的免费获取渠道
  • 经典算法题之汉明距离(二)
  • 公司注册网站模板上杭网站设计
  • 基于Spring AI的RAG和智能体应用实践
  • Flutter:跨平台开发终极指南
  • Python-将身份证正反面图片-生成PDF
  • 建单页网站搜网站的关键词
  • 数据科学每日总结--Day20--区块链
  • 自建网站平台有哪些建立个人网站能干
  • Docker中容器的备份方法和步骤
  • 折叠屏手机如何选:横向内折与竖向内折形态及核心参数解析
  • 我想网上做网站软件项目管理书籍推荐
  • el-table组件右侧出现空隙
  • 南宁响应式网站制作抖音运营公司排名前十
  • 【IO模型与并发服务器】
  • QT QML Item基类浅谈
  • Go语言学习笔记(二)
  • 前端CSS预处理器对比,Sass与Less
  • Ubuntu NAT模式设置静态 IP 地址
  • 建英文网站广州排名seo公司
  • Qt 对 JSON和XML文件的操作详解
  • flash网站开发广州门户网站制作公司