前后端集群搭建全流程

环境准备
| 节点 | ip | 职责 |
|---|---|---|
| db02 | 10.0.0.52/172.16.1.52 | 数据库 mysql-8.0 |
| web01 | 10.0.0.7/172.16.1.7 | 前端 nginx |
| web02 | 10.0.0.8/172.16.1.8 | 前端 nginx |
| web03 | 10.0.0.9/172.16.1.9 | 后端 jdk+nginx+tomcat |
| web04 | 10.0.0.10/172.16.1.10 | 后端 jdk+nginx+tomcat |
| lb01 | 10.0.0.5/172.16.1.5 | 负载均衡 nginx+keepalived |
| lb02 | 10.0.0.6/172.16.1.6 | 负载均衡 nginx+keepalived |
部署数据库
- db02节点部署数据库
二进制安装mysql-8.0.28
- 上传mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz文件
- MySQL :: 下载MySQL Yum存储库
[root@db02 ~]# ls mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz
mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz
mkdir -p /app/tools/ && mkdir -p /app/data/3306
tar -xvf mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz -C /app/tools/
ln -s /app/tools/mysql-8.0.28-linux-glibc2.12-x86_64 /app/tools/mysql
#安装依赖
yum install ncurses ncurses-devel libaio libaio-devel openssl openssl-devel openssh wget -y
#添加虚拟用户
useradd -s /sbin/nologin -M mysql
#设置配置文件
cat >/etc/my.cnf<<EOF
[mysqld]
user=mysql basedir=/app/tools/mysql/ datadir=/app/data/3306/ port=3306 socket=/tmp/mysql.sock
[client]
socket=/tmp/mysql.sock EOF chown mysql:mysql /etc/my.cnf chown -R mysql:mysql /app/data/3306 chown -R root:root /app/tools/mysql #配置PATH环境变量 echo ‘export PATH=/app/tools/mysql/bin:$PATH’ >> /etc/profile source /etc/profile #初始化,–initialize-insecure设置没有密码 mysqld –initialize-insecure –user=mysql \ –basedir=/app/tools/mysql/ –datadir=/app/data/3306/ echo $? cat >/usr/lib/systemd/system/mysqld.service<<EOF [Unit] Description=MySQL Server Documentation=man:mysqld(8) Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html After=network.target After=syslog.target [Install] WantedBy=multi-user.target [Service] User=mysql Group=mysql Type=notify TimeoutSec=0 OOMScoreAdjust=-1000 ExecStart=/app/tools/mysql/bin/mysqld –defaults-file=/etc/my.cnf $MYSQLD_OPTS EnvironmentFile=-/etc/sysconfig/mysql LimitNOFILE = 65536 Restart=on-failure RestartPreventExitStatus=1 Environment=MYSQLD_PARENT_PID=1 PrivateTmp=false EOF #设置开机自启服务 systemctl daemon-reload systemctl enable mysqld systemctl start mysqld #检查端口和服务,3306和mysql ss -lntup ps -ef | grep mysql mysql_secure_installation #用于设置root密码,清理用户和清理临时库 #登录数据库 mysql -uroot -p123
创建库,用户,授权用户
create database xzs charset utf8mb4;
create user xzs@'172.16.1.%' identified with mysql_native_password by '123';
grant all on xzs.* to xzs@'172.16.1.%';
flush privileges;
exit
#远程测试
mysql -uxzs -p123 -h 172.16.1.52
- 上传
xzs-sql-v3.9.0.zip数据包
[root@db02 ~]# unzip xzs-sql-v3.9.0.zip
Archive: xzs-sql-v3.9.0.zip
inflating: xzs-mysql.sql
inflating: xzs-postgresql.sql
#导入数据库
mysql -uroot -p123 xzs <xzs-mysql.sql
前端部署
==web01,web02==
部署nginx-1.28
vim /etc/yum.repos.d/nginx.repo
------------------------------------
[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 yum install -y nginx systemctl enable –now nginx nginx -v ps -ef | grep nginx ss -lntup | grep nginx mkdir -p /app/code/xzs/ ls /app/code/xzs/frontend/ admin student
- 配置前端nginx,web01,web02
[root@web01 ~]# cat /etc/nginx/conf.d/xzs.song.com.conf
server{
listen 80;
server_name admin.song.com;
root /app/code/xzs/frontend/admin/;
location / {
index index.html;
}
location /api {
proxy_pass http://10.0.0.4:8000;
}
}
server{
listen 80;
server_name stu.song.com;
root /app/code/xzs/frontend/student/;
location / {
index index.html;
}
location /api {
proxy_pass http://10.0.0.4:8000;
}
}
nginx -t
systemctl reload nginx
后端部署
==web03,web04同步操作==
部署nginx-1.28
vim /etc/yum.repos.d/nginx.repo
------------------------------------
[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 yum install -y nginx systemctl enable –now nginx nginx -v ps -ef | grep nginx ss -lntup | grep nginx
部署jdk
#yum源部署
yum list | grep openjdk
yum install -y java-11-openjdk-devel java-11-openjdk
java -version
yum install -y java-1.8.0-openjdk-devel java-1.8.0-openjdk
#设置优先级jdk-11
update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-11-openjdk-11.0.28.6-1.p01.ky10.x86_64/bin/java 200
update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-11-openjdk-11.0.28.6-1.p01.ky10.x86_64/bin/javac 200
#设置优先级jdk-1.8.0
update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.462.b08-4.p01.ky10.x86_64/bin/java 100
update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.462.b08-4.p01.ky10.x86_64/bin/javac 100
#上传jdk文件
#二进制部署jdk
mkdir -p /usr/local/jdk
tar -xvf openjdk-21.0.1_linux-x64_bin.tar.gz -C /usr/local/jdk/
tar -xvf openjdk-17.0.1_linux-x64_bin.tar.gz -C /usr/local/jdk/
cd /usr/local/jdk/
mv jdk-21.0.1 jdk21
mv jdk-17.0.1 jdk17
update-alternatives --install /usr/bin/java java /usr//jdk/jdk21/bin/java
#切换版本jdk
update-alternatives --config java
部署tomcat-9
wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.111/bin/apache-tomcat-9.0.111.tar.gz
tar -xf apache-tomcat-9.0.111.tar.gz -C /app/tools/
chown -R root:root /app/tools/apache-tomcat-9.0.111/
ln -s /app/tools/apache-tomcat-9.0.111 /app/tools/tomcat
root@web03 /app/tools]# cat /usr/lib/systemd/system/tomcat.service
[Unit]
Description=tomcat 9.0 by song
After=network.target
[Service]
Type=forking
ExecStart=/app/tools/tomcat/bin/startup.sh
ExecStop=/app/tools/tomcat/bin/shutdown.sh
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now tomcat
部署maven
[root@web03 ~]# ll apache-maven-3.9.11-bin.tar.gz
-rw-r--r-- 1 root root 9160848 11月 3 12:15 apache-maven-3.9.11-bin.tar.gz
tar -xvf apache-maven-3.9.11-bin.tar.gz -C /app/tools/
ln -s /app/tools/apache-maven-3.9.11 /app/tools/maven
echo 'export PATH=/app/tools/maven/bin/:$PATH' >>/etc/profile
source /etc/profile
#检查版本
mvn --version
部署node.js-16
上传文件node-v16.19.1-linux-x64.tar.xz
[root@web03 ~]# ls node-v16.19.1-linux-x64.tar.xz
node-v16.19.1-linux-x64.tar.xz
tar -xf node-v16.19.1-linux-x64.tar.xz -C /app/tools/
chown -R root:root /app/tools/node-v16.19.1-linux-x64/
[root@web03 ~]# cd /app/tools/
[root@web03 /app/tools]# ln -s node-v16.19.1-linux-x64 node
[root@web03 ~]# tail -1 /etc/profile
export PATH=/app/tools/node/bin/:$PATH
source /etc/profile
[root@web03 ~]# npm --version
8.19.3
[root@web03 ~]# node --version
v16.19.1
#配置npm下载源
npm config set registry https://registry.npmmirror.com
[root@web03 ~]# cat ~/.npmrc
registry=https://registry.npmmirror.com/
编译部署学之思
- 上传
xzs-mysql-master.zip
[root@web03 ~]# ls xzs-mysql-master.zip
xzs-mysql-master.zip
[root@web03 ~]# du -sh xzs-mysql-master.zip
215M xzs-mysql-master.zip
#解压目录
unzip xzs-mysql-master.zip
#前端编译
mkdir -p /app/code/xzs/{frontend,backend}
cd xzs-mysql-master/source/vue/xzs-admin/
npm config set sass_binary_site https://registry.npmmirror.com
npm install --registry https://registry.npmmirror.com
npm run build
cp -rp admin /app/code/xzs/frontend/
cd xzs-mysql-master/source/vue/xzs-student
npm config set sass_binary_site https://registry.npmmirror.com
npm install --registry https://registry.npmmirror.com
npm run build
cp -rp student /app/code/xzs/frontend/
#后端编译
cd /root/xzs-mysql-master/source/xzs/
mvn clean package
[root@web03 ~/xzs-mysql-master/source/xzs]# cd target/
cp xzs-3.9.0.jar /app/code/xzs/backend/
cp classes/application-prod.yml /app/code/xzs/backend/
[root@web03 /app/code/xzs]# ls
backend frontend
[root@web03 /app/code/xzs]# ls frontend/
admin student
[root@web03 /app/code/xzs]# ls backend/
application-prod.yml xzs-3.9.0.jar
[root@web03 /app/code/xzs/backend]# cat application-prod.yml
server:
port: 8000
undertow:
io-threads: 16
worker-threads: 4000
buffer_size: 1024
direct-buffers: true
compression:
enabled: true
min-response-size: 1
logging:
path: /app/code/xzs/backend/
spring:
datasource:
url: jdbc:mysql://172.16.1.52:3306/xzs?useSSL=false&useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true&allowMultiQueries=true
username: xzs
password: 123
driver-class-name: com.mysql.cj.jdbc.Driver
[root@web03 /app/code/xzs/backend]# java -Duser.timezone=Asia/Shanghai -Dspring.profiles.active=prod -jar xzs-3.9.0.jar
浏览器访问10.0.0.9:8000
学生端:student 密码:123456
后台:admin 密码:123456

- web03传web04文件
scp -r xzs root@10.0.0.10:`pwd`
scp -rp frontend root@10.0.0.7:`pwd`
scp -rp frontend root@10.0.0.8:`pwd`
- 书写启动jar包脚本
vim /server/scripts/xzs_status.sh
-------------------------------------------
#!/bin/bash
##############################################################
# File Name: install_tomcat.sh
# Version: V1.0
# Author: song
# Organization:
# Description:
##############################################################
#vars
function redecho(){
str=$*
echo -e "\E[0;31m${str}\E[0m"
}
function greenecho(){
str=$*
echo -e "\E[1;32m${str}\E[0m"
}
function yellowecho(){
str=$*
echo -e "\E[1;33m${str}\E[0m"
}
function blueecho(){
str=$*
echo -e "\E[1;34m${str}\E[0m"
}
#错误处理函数(执行命令失败时退出)
error_exit(){
redecho "Error: $1"
exit 1
}
service=xzs-3.9.0.jar
dir=/app/code/xzs/backend/
choose=$1
port=8000
log_file=${dir}xzs.log
start='java -Duser.timezone=Asia/Shanghai -Dspring.profiles.active=prod -jar xzs-3.9.0.jar'
time=`date +%F_%T`
pid=`ps -ef | grep -w "${start}" | grep -v grep | awk '{print $2}'`
pid_cnt=`ps -ef | grep -w "${start}" | grep -v grep | awk '{print $2}'|wc -l`
logmsg(){
msg="$*"
echo "$*" >>${log_file}
}
ngxweb_start(){
if [ ! -d ${dir} ];then
redecho "目录不存在"
exit 1
fi
if [ -n ${pid} ];then
cd ${dir}
nohup java -Duser.timezone=Asia/Shanghai -Dspring.profiles.active=prod -jar ${service} >/dev/null 2>&1 &
if [ $? -eq 0 ];then
greenecho "启动${service}成功"
else
redecho "启动${service}失败"
fi
fi
}
ngxweb_stop(){
if [ -n ${pid} ];then
kill ${pid}
greenecho "关闭${service}成功"
fi
}
ngxweb_restart(){
ngxweb_stop
sleep 1
ngxweb_start
}
ngxweb_status(){
if [ ${pid_cnt} -ne 0 ];then
echo "running [ok] [${pid}] $service"
logmsg "running [ok] [${pid}] [${time}] $service"
else
echo "running [Failed] [${pid}] $service"
logmsg "running [Failed] [${pid}] [${time}] $service"
fi
}
case "$choose" in
start) ngxweb_start ;;
stop) ngxweb_stop ;;
restart) ngxweb_restart;;
status) ngxweb_status;;
*) echo input error
esac
-------------------------------------------
#测试脚本是否成功
bash /server/scripts/xzs_status.sh start
#书写systemctl文件
[root@web03 ~]# cat /usr/lib/systemd/system/xzs.service
[Unit]
Description=apache tomcat by song
After=network.target
[Service]
Type=forking
ExecStart=bash /server/scripts/xzs_status.sh start
ExecStop=bash /server/scripts/xzs_status.sh stop
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start xzs.service
- 部署nginx配置文件,web03,web04
[root@web03 ~]# cat /etc/nginx/conf.d/xzs.song.com.conf
server{
listen 80;
server_name admin.song.com;
location /api {
proxy_pass http://localhost:8000;
}
}
server{
listen 80;
server_name stu.song.com;
location /api {
proxy_pass http://localhost:8000;
}
}
nginx -t
systemctl reload nginx
windows hosts文件解析
10.0.0.9 admin.song.com stu.song.com
浏览器访问域名

[root@web03 /etc/nginx/conf.d]# scp * root@10.0.0.10:`pwd`
[root@web03 /server/scripts]# scp xzs_status.sh root@10.0.0.10:`pwd`
[root@web04 /etc/nginx/conf.d]# systemctl reload nginx
用web04的ip,域名访问一下

部署负载均衡
==lb01,lb02同步==
部署nginx-1.28
vim /etc/yum.repos.d/nginx.repo
------------------------------------
[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 yum install -y nginx systemctl enable –now nginx nginx -v ps -ef | grep nginx ss -lntup | grep nginx mkdir -p /app/code/xzs/ ls /app/code/xzs/
部署keepalived
yum install -y keepalived
systemctl enable --now keepalived
cp /etc/keepalived/keepalived.conf{,.bak}
配置L4负载均衡
- lb01,lb02
[root@lb01 ~]# cat /etc/nginx/nginx.conf
#在最下面添加
stream {
log_format l4 '$remote_addr [$time_local] "$protocol" '
'$status $bytes_sent $bytes_received $session_time ';
include /etc/nginx/l4/*.conf;
}
mkdir -p /etc/nginx/l4/
#配置4层负载
[root@lb01 ~]# cat /etc/nginx/l4/xzs.song.com.conf
upstream xzs_pools{
hash $remote_addr consistent;
server 10.0.0.9:8000;
server 10.0.0.10:8000;
}
server{
listen 8000;
access_log /var/log/xzs-access.log l4;
error_log /var/log/xzs-error.log notice;
proxy_pass xzs_pools;
}
nginx -t
systemctl reload nginx
配置L7负载均衡
- lb01,lb02
[root@lb01 ~]# cat /etc/nginx/conf.d/xzs.song.com.conf
upstream xzs_l7_pools{
server 10.0.0.7:80;
server 10.0.0.8:80;
}
server{
listen 80;
server_name admin.song.com;
location / {
proxy_pass http://xzs_l7_pools;
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 stu.song.com;
location / {
proxy_pass http://xzs_l7_pools;
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 -t
systemctl reloa
lb01配置高可用
- 安装keepalived
yum install -y keepalived
systemctl enable --now keepalived
- 配置keepalived
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb01
}
#定义监控脚本
vrrp_script check_ngx.sh{
script /server/scripts/check_ngx.sh
interval 2 #每2秒执行一次
user root #执行用户root
weight 1 #权重
}
vrrp_instance vip_3 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3 dev ens33 label ens33:0
}
#调用脚本
track_script{
check_ngx.sh
}
}
vrrp_instance vip_4 {
state BACKUP
interface ens33
virtual_router_id 52
priority 60
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.4 dev ens33 label ens33:1
}
#调用脚本
}
systemctl restart keepalived
lb02配置高可用
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb02 #修改主机名
}
vrrp_instance vip_3 {
state BACKUP #声明备节点
interface ens33
virtual_router_id 51
priority 50 #设置优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3 dev ens33 label ens33:0
}
}
vrrp_instance vip_4 {
state MASTER #声明主节点
interface ens33
virtual_router_id 52
priority 100 #设置优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.4 dev ens33 label ens33:1
}
}
systemctl restart keepalived
最终成果
