完善之前的web架构
2026-06-10 09:03 kirimi 阅读(13) 评论(0) 收藏 举报企业级Web高可用架构部署与解说
一、 架构总览与图文解说
整个架构采用分层设计,涵盖了从网络边界、接入层、应用层到数据与存储层的完整链路,实现了高可用、负载均衡及数据实时备份。

| 层级 | 组件 | IP/备注 | 依赖/交互关系 |
|---|---|---|---|
| 用户层 | 用户/浏览器 | - | 发起 HTTP/HTTPS 请求到虚拟 IP |
| 接入层 | 虚拟 IP(VIP) | 192.168.148.150 | 接收用户请求,转发到 LB 集群 |
| 接入层 | lb01 | 192.168.148.141/10.0.0.11 | Nginx+Keepalived,与 lb02 做 VRRP 心跳 |
| 接入层 | lb02 | 192.168.148.142/10.0.0.12 | Nginx+Keepalived,与 lb01 做 VRRP 心跳 |
| Web 层 | web01 | 10.0.0.21 | Nginx+PHP+NFS 客户端,读写 MySQL、Redis、NFS |
| Web 层 | web02 | 10.0.0.22 | Nginx+PHP+NFS 客户端,读写 MySQL、Redis、NFS |
| 数据层 | MySQL 服务端 | 10.0.0.31 | 主数据存储,被 Web 层读写 |
| 数据层 | Redis 服务端 | 10.0.0.32 | 缓存,被 Web 层查询 |
| 存储层 | NFS 服务端 | 10.0.0.41 | 共享存储,被 Web 层挂载 |
| 存储层 | rsync 服务端 | 10.0.0.42 | 备份 NFS 数据 |
| 管理/网络层 | 堡垒机 | 10.0.0.51 | 管理内网机器 |
| 管理/网络层 | VPN 服务端 | 10.0.0.52 | 外网访问内网的入口 |
| 管理/网络层 | 路由器(ikuai) | 192.168.148.173/10.0.0.1 | 外网+内网网关,提供路由/NAT |
架构分层解说:
-
网络层与边界安全:
- 通过路由器(外网IP:192.168.148.180,内网网关:10.0.0.1)隔离内外网。
- 部署 VPN服务器 (10.0.0.52) 作为外网安全访问内网的唯一隧道入口,保障运维与办公安全接入。
-
接入层(负载均衡高可用):
- 由
lb01和lb02组成,安装Nginx + Keepalived - 对外提供虚拟IP(VIP:192.168.148.170),通过Keepalived实现VIP漂移,确保入口层单点故障不影响业务。
- Nginx负责将HTTP/HTTPS流量负载均衡到后端Web服务器,并处理SSL卸载(HTTPS)。
- 由
-
应用层(Web服务):
-
由
web01和web02组成,运行 Nginx + PHP (php-fpm)。 -
通过NFS客户端挂载共享存储,保证两台服务器上的用户上传文件、代码等静态资源一致。
-
通过配置PHP的Redis扩展,将Session交由Redis统一管理,解决多台Web服务器间的Session共享问题。
-
-
数据与存储层:
-
NFS服务器 (10.0.0.41):提供共享存储目录
/data,存放网站代码及用户上传资源。 -
Rsync备份服务器:结合Sersync对NFS的 /data目录进行实时同步,保障数据安全。
-
MySQL服务器:提供关系型数据库支撑(如Discuz论坛)。
-
Redis服务器 (10.0.0.32):作为缓存与Session存储中心,提升访问速度并保障会话一致性。
-
二、 核心模块详细配置指南
1. 接入层:Keepalived + Nginx 负载均衡与高可用
在 lb01 和 lb02 上执行以下配置,实现流量分发与故障自动转移。
① Keepalived 配置 (实现VIP漂移)
yum install -y keepalived nginx
vim /etc/keepalived/keepalived.conf
主节点配置示例(备节点需修改 state 为 BACKUP,priority 调低,router_id 改为 NODE2_BACKUP):
! Configuration File for keepalived
global_defs {
router_id NODE1_MASTER
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
}
vrrp_instance VI_1 {
state MASTER
interface ens224 # 绑定VIP的网卡
virtual_router_id 51
priority 120 # 优先级,高于备机
advert_int 1
nopreempt # 非抢占模式
authentication {
auth_type PASS
auth_pass 123456
}
track_script {
check_nginx
}
virtual_ipaddress {
192.168.148.150/24 # VIP地址
}
}
② Nginx 健康检查脚本
vim /etc/keepalived/check_nginx.sh
#!/bin/bash
nginx_num_check=ps -C nginx --no-header | wc -l
if [ $nginx_num_check -eq 0 ]; then
systemctl stop keepalived
fi
chmod +x /etc/keepalived/check_nginx.sh
③ Nginx 负载均衡与HTTPS配置
vim /etc/nginx/nginx.conf
在http块中添加upstream:
upstream web_server {
server 10.0.0.21:80 max_fails=3 fail_timeout=10;
server 10.0.0.22:80 max_fails=3 fail_timeout=10;
}
在 conf.d 下配置强制跳转HTTPS及代理规则:
vim /etc/nginx/conf.d/discuz.conf
server {
listen 80;
server_name discuz.fsj.com;
return 302 https://discuz.fsj.com$request_uri;
}
server {
listen 443 ssl;
server_name discuz.fsj.com;
ssl_certificate /nginx/fsj.crt;
ssl_certificate_key /nginx/fsj.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://web_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
(注:若无证书可用openssl自签:openssl req -x509 -newkey rsa:4096 -keyout fsj.key -out fsj.crt -days 365 -nodes -subj "/CN=fsj")
2. 应用层:Web服务与PHP环境优化
在 web01 和 web02 上配置NFS挂载与Redis会话共享。
① 挂载NFS共享存储
yum install rpcbind nfs-utils -y
systemctl start rpcbind.service
mkdir -p /nginx/kod
vim /etc/fstab
# 添加以下行
10.0.0.41:/data/ /nginx nfs defaults 0 0
systemctl daemon-reload
mount -a
② 配置PHP Session存入Redis
解决多台Web服务器登录状态不一致的问题:
# 安装php-redis扩展
yum install php-devel -y
cd /usr/local/src/
wget https://pecl.php.net/get/redis-6.2.0.tgz
tar -xf redis-6.2.0.tgz && cd redis-6.2.0/
phpize
./configure --with-php-config=/usr/bin/php-config
make && make install
# 启用扩展
cp /etc/php.d/20-mbstring.ini /etc/php.d/20-redis.ini
vim /etc/php.d/20-redis.ini
# 写入:extension=redis
# 修改PHP-FPM配置
vim /etc/php-fpm.d/www.conf
# 修改session配置为:
php_value[session.save_handler] = redis
php_value[session.save_path] = "tcp://10.0.0.32:6379"
systemctl restart php-fpm
③ 配置Nginx支持Discuz
vim /etc/nginx/conf.d/discuz.conf
server {
listen 80;
server_name discuz.fsj.com;
root /nginx/discuz;
index index.php index.html;
location ~ .php$ {
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS on; # 强制HTTPS
include fastcgi_params;
}
}
3. 存储层:NFS与实时同步备份
① NFS服务器端 (10.0.0.41) 配置
yum install nfs-utils -y
mkdir /data
vim /etc/exports
# 添加配置:
/data 10.0.0.0/24(rw,sync,no_root_squash,no_all_squash)
② Rsync服务端(接收备份)配置
在备份目标服务器上安装并配置:
yum install rsync-daemon.noarch
vi /etc/rsyncd.conf
写入以下配置:
uid = root
gid = root
use chroot = no
max connections = 10
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
[backup]
path = /data
comment = Backup Destination Directory
read only = no
auth users = rsync_user
secrets file = /etc/rsyncd.secrets
hosts allow = 10.0.0.41
创建密码文件并启动服务:
echo "123" > /etc/rsyncd.secrets
chmod 600 /etc/rsyncd.secrets
systemctl enable rsyncd --now
③ Sersync 实时同步(NFS源端发起)
在NFS服务器上部署Sersync,监听 /data 变化并推送到Rsync:
# 准备免密凭据
echo "123" > /etc/rsync.pass
chmod 600 /etc/rsync.pass
# 手动测试同步命令 在nfs和rsync上都要创建/data目录
rsync -avz --password-file=/etc/rsync.pass /data/ rsync://rsync_user@10.0.0.42/backup
# 部署 Sersync
mkdir -p /usr/local/sersync && cd /usr/local/sersync
wget https://github.com/wsgzao/sersync/raw/master/sersync2.5.4_64bit_binary_stable_final.tar.gz
tar -zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz
mv GNU-Linux-x86/sersync2 ./sersync
mv GNU-Linux-x86/confxml.xml ./
rm -rf GNU-Linux-x86 *.tar.gz
# 修改 confxml.xml 中的监控路径(<localpath watch="/data">)和rsync目标配置后,
#前台启动,观察是否推送成功
/usr/local/sersync/sersync -r -o /usr/local/sersync/confxml.xml
#配置为系统服务开机自启:
vim /etc/systemd/system/sersync.service
[Unit]
Description=Sersync File Sync Service
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/sersync/sersync -d -r -o /usr/local/sersync/confxml.xml
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable sersync --now
4. 数据层:MySQL与Redis配置
① MySQL 8.0 配置
yum install mysql-server mysql -y
mysql_secure_installation
systemctl start mysqld && systemctl enable mysqld
# 创建业务数据库与授权(以Discuz为例)
mysql -uroot -p'123@qq.COM'
create database discuz character set utf8mb4;
create user discuz@'%' identified by '123@qq.COM';
grant all on discuz.* to discuz@'%';
② Redis 缓存服务配置
yum install redis -y
vim /etc/redis/redis.conf
# 修改bind监听内网地址
bind 10.0.0.32
# 如需密码认证取消注释:requirepass 123@qq.COM
systemctl start redis && systemctl enable redis
# 验证连接
redis-cli -h 10.0.0.32
浙公网安备 33010602011771号