代码改变世界

完善之前的web架构

2026-06-10 09:03  kirimi  阅读(13)  评论(0)    收藏  举报

企业级Web高可用架构部署与解说

一、 架构总览与图文解说

整个架构采用分层设计,涵盖了从网络边界、接入层、应用层到数据与存储层的完整链路,实现了高可用、负载均衡及数据实时备份。

ima-流程图

层级 组件 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

架构分层解说:

  1. 网络层与边界安全

    • 通过路由器(外网IP:192.168.148.180,内网网关:10.0.0.1)隔离内外网。
    • 部署 VPN服务器 (10.0.0.52) 作为外网安全访问内网的唯一隧道入口,保障运维与办公安全接入。
  2. 接入层(负载均衡高可用)

    • lb01lb02 组成,安装 Nginx + Keepalived
    • 对外提供虚拟IP(VIP:192.168.148.170),通过Keepalived实现VIP漂移,确保入口层单点故障不影响业务。
    • Nginx负责将HTTP/HTTPS流量负载均衡到后端Web服务器,并处理SSL卸载(HTTPS)。
  3. 应用层(Web服务)

    • web01web02 组成,运行 Nginx + PHP (php-fpm)

    • 通过NFS客户端挂载共享存储,保证两台服务器上的用户上传文件、代码等静态资源一致。

    • 通过配置PHP的Redis扩展,将Session交由Redis统一管理,解决多台Web服务器间的Session共享问题。

  4. 数据与存储层

    • NFS服务器 (10.0.0.41):提供共享存储目录 /data,存放网站代码及用户上传资源。

    • Rsync备份服务器:结合Sersync对NFS的 /data目录进行实时同步,保障数据安全。

    • MySQL服务器:提供关系型数据库支撑(如Discuz论坛)。

    • Redis服务器 (10.0.0.32):作为缓存与Session存储中心,提升访问速度并保障会话一致性。

二、 核心模块详细配置指南

1. 接入层:Keepalived + Nginx 负载均衡与高可用

lb01lb02 上执行以下配置,实现流量分发与故障自动转移。

① 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环境优化

web01web02 上配置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