若依项目部署--传统架构--未完待续
若依项目介绍
项目源码获取
#Git工具下载
dnf -y install git
#若依项目获取
git clone https://gitee.com/y_project/RuoYi-Vue.git
项目背景
随着企业信息化需求的增加,传统开发模式存在效率低,重复劳动多等问题。若依项目通过整合主流技术框架,提供了一套标准化,模块化的开发方案,降低了开发门槛,提升开发效率
核心特性
前后端分离架构
前端使用Vue.js框架,后端使用SPring Boot框架,前后端通过RESTful API交互,提升开发效率和用户体验
模块化设计
系统划分为多个功能模块(如用户管理,权限管理,系统监控等),开发者可根据需求灵活选择和扩展
权限控制
基于RBAC模型,提供颗粒度的权限管理,支持菜单,按钮级别的权限控制
代码生成器
内置代码生成工具,可根据数据库表自动生成前后端代码,减少重复开发工作
多租户支持
支持多租户架构,满足不同企业或部门的独立数据隔离需求
响应式布局
前端界面适配不同设备,提供良好的用户体验
技术架构
后端技术栈
Spring Boot
核心框架,提供快速开发和部署能力
MyBatis-PlusORM
简化数据库操作
Shiro/Spring Security
安全框架,实现权限控制
Redis
缓存数据库,提升系统性能
Elasticsearch
全文检索引擎,支持复杂查询
前端技术栈
Vue.js
前端框架,构建动态用户界面
Element UI
提供丰富的组件和样式
Axios
HTTP客户端,处理前后端数据交互
数据库
MySQL
主数据库,存储业务数据
项目架构
整体流程
用户流量分析
1—用户通过域名进行程序的访问
2—进行dns解析,将域名解析为ip地址,并进行访问
3—在服务器接受到用户请求后,先使用防火墙进行过滤,判断是否为黑名单中的用户
4—合法用户通过防火墙后访问LVS四层负载均衡器,根据负载均衡算法将请求转发到不同的NGINX服务器
5—如果用户的请求为静态请求,NGINX直接返回相应资源
6—如果用户的请求是动态请求,则将请求根据负载均衡算法发送到后台服务器
7—后台服务器在需要数据时先到Redis-cluster中进行查询,查询到则将信息返回
8—未查询到将到MySQL-cluster中查询数据,然后由MySQL-cluster进行数据返回
9—MySQL-cluster将数据返回后,将此次返回数据放入Redis-cluster中,提高下次查询速度
高可用集群配置
使用keepalived对NGINX进行高可用配置,使用vip对外提供服务,防止单个NGINX出现故障导致整个服务宕机,影响客户使用
负载均衡集群配置
四层负载均衡LVS
在一台服务器配置LVS代理规则,将用户流量进行转发,提高整体的并发性能
七层负载均衡NGINX
首先使用NGINX对服务进行静态分离,静态请求使用NGINX直接进行处理,动态请求代理到后端服务器进行处理
其次,使用NGINX对后端服务器做负载均衡,提高后端服务器的并发性能
集群监控配置
使用zabbix对整个集群进行监控,首先针对所有服务器的基本信息进行监控,其次对部署的各个应用进行监控,确保能够及时对系统出现的问题进行发现并加以修改并通过后续操作进行预防
应用架构优化
系统本身优化
NGINX优化
数据库优化
zabbix监控优化
安全加固
使用iptables进行限制
自动化运维使用
zabbix中配置触发器
MySQL数据定时备份
iptables脚本触发加入黑名单
项目规划
操作系统版本: centos-stream 9
NGINX版本:1.20
Redis版本: 6.2.18
MySQL版本:5.7.44
zabbix版本:7.0
虚拟机信息配置
| 主机名 | 部署项目 | ip地址 | 硬件配置 |
| lvs-host | LVS && zabbix-agent && iptables | 192.168.26. | |
| nginx-host1 | nginx && keepalived && zabbix-agent | | |
| nginx-host2 | nginx && keepalived && zabbix-agent | | |
| java-host1 | ruoyi && zabbix-agent2 | | |
| java-host2 | ruoyi && zabbix-agent2 | | |
| redis-cluster | redis-cluster && zabbix-agent2 | | |
| mysql-master | mysql && zabbix-agent2 | | |
| mysql-replica | mysql && zabbix-agent2 | | |
| zabbix-server | zabbix-server && mysql && nginx | | |
项目部署
部署顺序:
graph TD
A[基础设施部署] --> B[数据库]
A --> C[缓存服务]
A --> D[消息队列(可选)]
B --> E[后端服务部署]
C --> E
D --> E
E --> F[前端部署]
F --> G[测试与验证
MySQL主从集群配置
主库配置
基础环境部署
#更改主机名
hostnamectl set-hostname mysql-master
#永久关闭防火墙
systemctl disable --now firewalld
#永久关闭Selinux
setenforce 0 && sed -ri 's/enforcing/disabled/' /etc/selinux/config
#安装常用软件
dnf -y install vim wget tree net-tools yum-utils git
#重启生效
reboot
安装所需版本MySQL数据库
mysql官网: https://www.mysql.com
#获取所需版本
cat << EOF >> /etc/yum.repo.d/mysql-community.repo
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/6/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
EOF
#安装MySQL数据库
dnf -y install mysql mysql-server
#启动数据库
systemctl enable --now mysqld
#搜索初始密码
grep "password" /var/log/mysqld.log
#更改MySQL数据库密码
mysqladmin -uroot -p'init_password' password 'your_password'
#获取项目源码
git clone https://gitee.com/y_project/RuoYi-Vue.git
数据准备
#创建数据库
CREATE DATABASE ry_vue CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
#创建用户
CREATE USER 'ry'@'%' IDENTIFIED BY 'Ry@123456';
#授予权限
GRANT ALL PRIVILEGES ON ry_vue.* TO 'ry'@'%';
#刷新权限
FLUSH PRIVILEGES;
#导入数据
mysql -ury -p'Ry@123456' ry_vue < RuoYi-Vue/sql/ry_20250522.sql
mysql -ury -p'Ry@123456' ry_vue < RuoYi-Vue/sql/quartz.sql
#验证数据是否成功导入
USE ry_vue;
SHOW TABLES;
主从复制配置
#修改配置文件,在mysqld配置加入一下选项
server-id = 1
log_bin = mysql-bin
binlog_format = ROW
#重启MySQL服务
systemctl restart mysqld
#创建同步用户
CREATE USER 'repl'@'%' IDENTIFIED BY 'Repl@123456';
#为同步用户授权
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
#刷新权限
FLUSH PRIVILEGES;
#查看偏移量
SHOW BINARY LOG STATUS\G
server-id必须具有唯一性
MySQL新版本中查看偏移量的语句更改,不是SHOW MASTER STATUS\G
至此 MySQL主库配置完毕
从库配置
基础环境部署
#更改主机名
hostnamectl set-hostname mysql-replica
#永久关闭防火墙
systemctl disable --now firewalld
#永久关闭Selinux
setenforce 0 && sed -ri 's/enforcing/disabled/' /etc/selinux/config
#安装常用软件
dnf -y install vim wget tree net-tools yum-utils
#重启生效
reboot
安装所需版本MySQL数据库
#获取所需版本
wget https://dev.mysql.com/get/mysql84-community-release-el9-1.noarch.rpm
rpm -vih mysql84-community-release-el9-1.noarch.rpm
cat /etc/yum.repos.d/mysql-community.repo #可以编辑此文件内容来选择所需版本MySQL进行下载
#安装MySQL数据库
dnf -y install mysql mysql-server
#启动数据库
systemctl enable --now mysqld
#搜索初始密码
grep "password" /var/log/mysqld.log
#更改MySQL数据库密码
mysqladmin -uroot -p'init_password' password 'your_password'
#导入数据
mysql -ury -p'Ry@123456' ry_vue < RuoYi-Vue/sql/ry_20250522.sql
mysql -ury -p'Ry@123456' ry_vue < RuoYi-Vue/sql/quartz.sql
主从复制配置
CHANGE REPLICATION SOURCE TOSOURCE_HOST='source_host_name',SOURCE_USER='replication_user_name',SOURCE_PASSWORD='replication_password',SOURCE_LOG_FILE='recorded_log_file_name',SOURCE_LOG_POS=recorded_log_position;
Redis-cluster集群配置
由于主机配置有限,此处在一台机器上配置六个Redis实例,组成Redis集群,提供服务
基础环境部署
#更改主机名
hostnamectl set-hostname redis-cluster
#永久关闭防火墙
systemctl disable --now firewalld
#永久关闭Selinux
setenforce 0 && sed -ri 's/enforcing/disabled/' /etc/selinux/config
#安装常用软件
dnf -y install vim wget tree net-tools yum-utils git
#重启生效
reboot
安装Redis应用
Redis官网: https://redis.io
#安装所需版本Redis--此时安装的版本即为所需版本,如需其他版本可去官网
dnf -y install redis
#复制多个配置文件,并修改配置文件,从而在一台主机上运行多个Redis实例,配置集群
cd /etc/redis
for i in {1..6};do cp redis.conf redis.$i.conf ;done
#创建数据存放目录
for i in {1..6};do mkdir -p /var/lib/redis/data/data_$i;done
#修改配置文件
#修改监听ip地址,保证集群之间可以互相监听
bind 0.0.0.0
#修改端口,配置在同一机器,保证端口不互相冲突
port 6379
#设置以守护进程方式运行
daemonize yes
#配置认证密码
requirepass 123456
#指定pid存储位置
pidfile /var/run/redis_6379.pid
#定义日志文件
logfile /var/log/redis/redis_6379.log
#设置数据保存目录
dir /var/lib/redis/data/data_2
#开启以集群方式启动
cluster-enabled yes
#保存集群配置文件
cluster-config-file nodes.conf
#配置节点连接超时时间
cluster-node-timeout 5000
配置Redis集群
#开启Redis各个实例
for i in {1..6}; do redis-server redis.$i.conf ;done
#以集群模式运行
redis-cli -a 123456 --cluster create --cluster-replicas 1 192.168.26.103:6379 192.168.26.103:6380 192.168.26.103:6381 192.168.26.103:6382 192.168.26.103:6383 192.168.26.103:6384
--cluster-replicas 1 #配置单个从节点的模式启动
-a 123456 #配置启动是的密码
验证集群状态
cluster nodes
后端服务搭建
由于两台后台服务器部署步骤类似,以其中一台为例,可以在jar包构建完毕之后直接传送到另一台后端服务器直接运行
基础环境配置
#更改主机名
hostnamectl set-hostname java-host1
#永久关闭防火墙
systemctl disable --now firewalld
#永久关闭Selinux
setenforce 0 && sed -ri 's/enforcing/disabled/' /etc/selinux/config
#安装常用软件
dnf -y install vim wget tree net-tools yum-utils git
#重启生效
reboot
项目部署
jdk版本: 17.0.14
maven版本: 3.6.3
openjdk官网: https://openjdk.org
maven官网: https://maven.apache.org/
#安装软件openjdk,maven
yum -y install java maven #此处使用的为centos stream 9 仓库中的默认版本
#更改maven配置,提高maven插件安装速度
vim /etc/maven/settings.xml<mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>阿里云公共仓库</name><url>https://maven.aliyun.com/repository/public</url></mirror>
#更改项目数据库配置
/root/RuoYi-Vue/ruoyi-admin/src/main/resources/application.yaml #更改Redis相关连接信息,使用集群方式启动
/root/RuoYi-Vue/ruoyi-admin/src/main/resources/application-druid.yml #更改MySQL数据库,配置主库从库相关信息
#插件下载
mvn install
#进入对应目录
cd RuoYi-Vue/ruoyi-admin/
#进行源代码构建
mvn clean package
#启动项目
java -jar ruoyi-admin.jar
结果验证
通过生成日志进行验证
通过访问本机ip的8080端口进行结果访问
前端服务搭建
基础环境部署
两台nginx服务器配置类似,因此也以一台作为实例
nginx: 1.20
nodejs: 16.20.2
nginx官网: https://nginx.org/
nodejs官网: https://nodejs.org/zh-cn
#更改主机名
hostnamectl set-hostname nginx-host1
#永久关闭防火墙
systemctl disable --now firewalld
#永久关闭Selinux
setenforce 0 && sed -ri 's/enforcing/disabled/' /etc/selinux/config
#安装常用软件
dnf -y install vim wget tree net-tools yum-utils git elep-release
#安装所需软件
dnf -y nginx node
#启动nginx
systemctl enable --now nginx
#测试nginx是否成功运行
ss -lntp | grep "nginx"
前端代码上线
#切换到前端代码目录
cd /root/RuoYi-Vue/ruoyi-ui
#安装node插件
npm install --registry=http://registry.npmmirror.com
#编译前段代码
npm run build:prod
#由于使用的nodejs版本较高,与项目中的加密算法不符,使用一下命令暂时重置加密算法的环境变量然后重新编译
export NODE_OPTIONS=--openssl-legacy-provider
#查看编译后的项目
ls dist
#更换dist目录权限
chmod 755 dist
#删除nginx原有默认发布目录
rm -rf /usr/share/nginx/html
#将dist目录与nginx默认发布目录进行软链接(注意使用绝对路径)
ln -s /root/RuoYi-Vue/ruoyi-ui/dist/ /usr/share/nginx/html
#修改nginx配置文件,保证请求能够转发到正确主机
#前端项目配置
location / {root /ruoyi/ruoyi-ui/dist;try_files $uri $uri/ /index.html; # 该指令按顺序尝试匹配文件index index.html index.htm;
}
#后端项目配置 此处使用单个java-host1进行反向代理,后面会使用nginx的upstrea模块进行负载均衡的配置
location /prod-api/ {proxy_set_header Host $http_host; # 传递原始请求的Host头。proxy_set_header X-Real-IP $remote_addr; # 记录客户端真实IP地址。proxy_set_header REMOTE-HOST $remote_addr; # 记录客户端真实IP地址。proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 记录经过代理链的完整IP链。proxy_pass http://192.168.26.104:8080/;}
项目结果验证
通过访问nginx主机的80端口进行验证
登录界面
管理界面
项目优化
nginxHA && LB集群搭建
LB集群搭建
两台nginx服务器上均进行LB集群的搭建,仍以其中一天为例
#在nginx配置文件中使用upstream模块定义后端java服务池
upstream application {server 192.168.26.103:8080 ;server 192.168.26.104:8080 ;}#更改location匹配规则,使用proxy_pass进行反向代理
HA集群搭建
keepalived版本: 2.2.8
keepalived官网: https://keepalived.org
#两台nginx主机安装keepalived
dnf -y install keepalived
lvs配置 && iptables配置
基础环境部署
#更改主机名
hostnamectl set-hostname lvs-iptables
#永久关闭防火墙
systemctl disable --now firewalld
#永久关闭Selinux
setenforce 0 && sed -ri 's/enforcing/disabled/' /etc/selinux/config
#安装常用软件
dnf -y install vim wget tree net-tools yum-utils git elep-release
#安装所需软件
dnf -y install ipvsadm iptables iptables-service
#重启生效
iptables配置
使用iptables时,需要关闭firewalld
iptables默认配置文件: /etc/sysconfig/iptables
iptables默认规则存放位置: /etc/sysconfig/iptables-config
使用redis-cluster作为客户端进行测试,验证iptables的过滤作用
#启动iptablees
systemctl enable --now iptables
#未添加规则使用redis-cluster主机进行测试
ping 192.168.26.106
#配置过滤规则,拒绝redis-cluster主机的ping协议
iptables -A INPUT -s 192.168.26.103 -p icmp -j REJECT
#使用redis-cluster主机进行测试
ping 192.168.26.106
可以使用脚本的形式,过滤出nginx访问日志中速度较快的ip进行规则的添加从而达到防止DDoS攻击的目的
在生产环境中,会配置源ip,源端口,目标ip,目标端口来进行屏蔽 iptables语法:
iptables -A INPUT -s 192.168.26.103 -p tcp --dport 80 -j REJECT #限制ip为192.168.25.103主机对当前主机80端口的访问
测试实例图:
lvs配置
lvs主机配置
DR机器配置
结果验证
zabbix监控配置
基础环境配置
#更改主机名
hostnamectl set-hostname zabbix-server
#永久关闭防火墙
systemctl disable --now firewalld
#永久关闭Selinux
setenforce 0 && sed -ri 's/enforcing/disabled/' /etc/selinux/config
#安装常用软件
dnf -y install vim wget tree net-tools yum-utils git
#重启生效
reboot
zabbix的安装
zabbix使用版本: zabbix7.0
zabbix官网: https://www.zabbix.com/
#安装zabbix的yum源仓库
rpm -Uvh https://repo.zabbix.com/zabbix/7.0/alma/9/x86_64/zabbix-release-latest-7.0.el9.noarch.rpm
dnf clean all
#安装zabbix相关组件
dnf -y install zabbix-server-mysql zabbix-web-mysql zabbix-nginx-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent2
#安装zabbix agent2相关插件
dnf -y install zabbix-agent2-plugin-mongodb zabbix-agent2-plugin-mssql zabbix-agent2-plugin-postgresql
#创建所需数据库
create database zabbix character set utf8mb4 collate utf8mb4_bin;
#创建使用用户并授权
create user zabbix@localhost identified by 'Zabbix@123';
grant all privileges on zabbix.* to zabbix@localhost;
flush privileges;
set global log_bin_trust_function_creators = 1;
#导入所需数据
zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql --default-character-set=utf8mb4 -uzabbix -p zabbix
#更改Zabbix配置文件中数据库的配置
#文件名 /etc/zabbix/zabbix_server.conf
#启动zabbix相关进程
systemctl enable --now zabbix-server zabbix-agent2 nginx php-fpm
#验证启动是否成功
ss -lntp
zabbix-server安装成功之后,访问zabbix-server主机的80端口
配置zabbix监控
ansible使用版本: 2.14.18
ansible官网: https://docs.ansible.org.cn/
使用zabbix的自动注册功能,配置各个主机
客户端安装agent2端
#生成ssh秘钥对
ssh-keygen
#配置域名解析
cat << EOF >> /etc/hosts
192.168.26.101 mysql-master
192.168.26.102 mysql-replica
192.168.26.103 redis-cluster
192.168.26.104 java-host1
192.168.26.105 java-host2
192.168.26.106 lvs-iptables
192.168.26.107 nginx-host1
192.168.26.108 nginx-host2
192.168.26.109 zabbix-server
EOF
#对其他主机进行配置免密认证
for i in `cat /etc/hosts |grep -vw "localhost" | awk '{print $2}'`; do echo $i ;done
#安装ansible应用
dnf -y install epel-release && dnf -y install ansible
#配置资源清单
cat << EOF >> /etc/ansible/hosts
[mysql]
mysql-master
mysql-replica
[redis]
redis-cluster
[application]
java-host1
java-host2
[web]
nginx-host1
nginx-host2
[iptables]
lvs-iptables
[zabbix]
zabbix-server
EOF
#配置ansible的清单文件,在所有节点安装zabbix-agent2服务并开启
cat << EOF >> zabbix-setting.yaml
---
- hosts: allname: zabbix-agent-setuser: rootgather_facts: novars:packages:- zabbix-agent2- zabbix-agent2-plugin-mongodb- zabbix-agent2-plugin-mssql- zabbix-agent2-plugin-postgresqltasks:- name: judge zabbix-agent yum repositry existsshell: cat /etc/yum.repos.d/zabbix.repoignore_errors: yesregister: repo_result- name: set zabbix-agent yum repositoryshell: rpm -Uvh https://repo.zabbix.com/zabbix/7.0/alma/9/x86_64/zabbix-release-latest-7.0.el9.noarch.rpm \ && dnf clean allwhen: repo_result.rc != 0- name: install zabbix-agent package and plugindnf:name: "{{ item }}"state: installedloop: "{{ packages }}"- name: copy zabbix-agent configurecopy:src: /root/zabbix_agent2.confdest: /etc/zabbix/zabbix_agent2.conf- name: copy diy system minitor scriptcopy:src: /root/system_os.shdest: /etc/zabbix/zabbix_agent2.d/system_os.sh- name: copy diy minitor configure filecopy:src: /root/system_os.confdest: /etc/zabbix/zabbix_agent2.d/system_os.conf- name: start zabbix-agent2 serviceservice:name: zabbix-agent2state: startedenabled: yes
#清单中所使用的zabbix-agent2配置文件,修改以下配置
#注释原有文件主机名
#Hostname=Zabbix server
#获取当前主机名
HostnameItem=system.hostname
# 获取当前主机元数据信息
HostMetadataItem=system.uname
#执行清单文件
ansible-playbook zabbix-setting.yaml
服务端配置
配置自动注册规则
验证自动注册结果
此时可以实现对所有主机进行监控,但是监控项是由系统提供,并且监控项目多,可以配置自定义监控项实现对不同主机的不同项目进行监控
添加自定义监控项
如果先配置了自定义监控模版,可以在自动注册时直接进行链接模版,更为方便
针对不同主机,配置不同监控项目
共有监控项目: 针对所有主机,都进行一下项目的监控–系统开机时间,系统内存使用量,系统根分区剩余量,网络可用性,用户数量,cpu负载,用户文件哈希值等项目数据获取时间和数据保存时间可以根据自己的情况进行定义
配置所有主机自定义监控项
#配置全局系统自定义监控项
cat << EOF >> system_os.sh
#!/bin/bash
#获取开机时间
up_time() {
cat /proc/uptime | awk '{print $1}'
}
mem_used() {
free -m | awk '/Mem/ {print $3/$2*100}'
}
fdisk_free() {
used=`df -hT | grep -w / | awk '{print $(NF-1)}' | tr -d "%"`
echo $((100-used))
}
nat_state() {
ping www.baidu.com -c1 -W1 &> /dev/null && echo yes || echo no
}
user_number() {
wc -l /etc/passwd | awk '{print $1}'
}
load_average() {
uptime | awk '{print $9}' | tr -d ","
}
hash_user_file() {
md5sum /etc/passwd | awk '{print $1}'
}
$1
EOF
#将自定义监控项配置到配置文件
cat << EOF >> system_os.conf
UserParameter=system_os[*],bash /etc/zabbix/zabbix_agent2.d/system_os.sh $1
EOF
#重启zabbix-agent2
systemct restart zabbix-agent2
#本机验证配置结果
zabbix_agent2 -t system_os[up_time]
配置MySQL数据库主机自定义监控项
配置redis-cluster主机自定义监控项
配置java主机自定义监控项
配置nginx主机自定义监控项
配置lvs-iptbles主机自定义监控项
配置自定义监控项
各个主机最好使用不同的模版进行解耦,此处配置自定义监控项为实例
添加触发器,告警动作等
验证
jumpserver配置
cicd
mycat的使用
dns域名反向代理
ELK集群日志收集
HTTP使用ssl证书安全通信
书写初始化脚本,提高系统初始化速度
使用脚本快速实现主机免密认证
书写系统初始化脚本加快系统配置
收获与总结