记录一次简单的web架构
2026-05-30 19:52 kirimi 阅读(0) 评论(0) 收藏 举报一、核心理论
一、架构核心逻辑(从用户到后端的全流程)
-
用户访问入口:用户通过虚拟IP(VIP:192.168.148.170)发起请求。
-
负载均衡层:VIP由
lb01、lb02(部署nginx+keepalived)承载,通过 keepalived 实现VIP漂移(高可用),并将请求反向代理+负载均衡到后端Web服务器(web01/web02)。 -
Web服务器层:web01/web02(可横向扩展)部署
nginx+php+nfs客户端,负责:
nginx处理静态资源、反向代理;php处理动态业务逻辑;nfs客户端挂载nfs服务器的共享存储,保证多节点文件(代码、静态资源)一致性。
-
数据交互层:
- Web服务器向
mysql服务器读写业务数据; redis服务器作为缓存层,加速热点数据访问,降低数据库压力。
- Web服务器向
-
响应返回:Web服务器处理完请求后,响应经负载均衡层回传给用户。
二、可视化架构图

一、环境规划表
| ip地址 | 主机名 | 需要安装的服务 | 备注 |
|---|---|---|---|
| 192.168.148.162 | lb01 | nginx+keepalived | 暂无 |
| 192.168.148.163 | lb02 | nginx+keepalived | 暂无 |
| 192.168.148.164 | web01 | nginx+php+nfs客户端 | 暂无 |
| 192.168.148.165 | web02 | nginx+php+nfs客户端 | 无 |
| 192.168.148.166 | nfs | nfs服务端 | 无 |
| 192.168.148.167 | mysql | mysql服务端 | 无 |
| 192.168.148.170 | 无 | 虚拟IP | 用户访问这个虚拟IP跳转到lb01和lb02 |
| 192.168.148.171 | redis | redis服务端 | 缓存层,加速热点数据/存储session) |
二、分层部署步骤
架构逻辑:接入层→存储层→应用层→数据层,
步骤1:接入层部署(lb01、lb02:nginx+keepalived)
lb01和lb02安装nginx和keepalived,配置keepalived实现虚拟IP漂移,配置nginx实现负载均衡。
- 安装keepalived和nginx。
yum install -y keepalived nginx
- 配置keepalived实现虚拟IP漂移。
# 编辑keepalived配置文件
vim /etc/keepalived/keepalived.conf# 配置内容示例 主节点(lb01)
! Configuration File for keepalived
global_defs {router_id NODE1_MASTER # 节点唯一标识
}
vrrp_script check_nginx {script "/etc/keepalived/check_nginx.sh"interval 2 # 每2秒检测一次nginx状态
}
vrrp_instance VI_1 {state MASTER # 主节点interface ens160 # 绑定VIP的网卡(根据实际环境调整)virtual_router_id 51 # 主备必须一致(0-255)priority 120 # 优先级,比备机高(如120 vs 100)advert_int 1 # 心跳间隔1秒nopreempt # 非抢占(推荐,避免频繁切换)authentication {auth_type PASSauth_pass 123456 # 密码,主备一致}# 绑定检测脚本track_script {check_nginx}virtual_ipaddress {192.168.148.170/24 # VIP,与物理IP同网段}# 可选:检测本机网卡/服务状态track_interface {ens160}
}# 配置内容示例 备节点(lb02)
! Configuration File for keepalived
global_defs {router_id NODE2_BACKUP
}vrrp_script check_nginx {script "/etc/keepalived/check_nginx.sh"interval 2 # 每2秒检测一次
}vrrp_instance VI_1 {state BACKUPinterface ens160virtual_router_id 51 # 与Master一致priority 100 # 低于Masteradvert_int 1nopreemptauthentication {auth_type PASSauth_pass 123456}# 绑定检测脚本track_script {check_nginx}virtual_ipaddress {192.168.148.170/24}track_interface {ens160}
}
# 配置检测脚本
vim /etc/keepalived/check_nginx.sh
#脚本内容示例 检测nginx状态,如果nginx断开,则停止keepaliverd 虚拟ip转移另一台机器上
#!/bin/bash
nginx_num_check=`ps -C nginx --no-header | wc -l`
if [ $nginx_num_check -eq 0 ]; thensystemctl stop keepalived
fi
# 赋予脚本执行权限
chmod +x /etc/keepalived/check_nginx.sh
- 配置nginx实现负载均衡(保留原有配置,仅补充Discuz业务转发规则)
# 编辑nginx配置文件
vim /etc/nginx/nginx.conf
# 原upstream配置完全保留,无需修改(所有业务共用后端web池)
worker_processes 1;
events {worker_connections 1024;
}
http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;upstream web_server {server 192.168.148.164:80 max_fails=3 fail_timeout=10;server 192.168.148.165:80 max_fails=3 fail_timeout=10;}include /etc/nginx/conf.d/*.conf;
}
# 在conf.d目录下新增Discuz负载均衡配置(原有kod.conf、phpmyadmin.conf完全保留)
vim /etc/nginx/conf.d/discuz.conf
# 配置内容示例(适配Discuz HTTPS需求)
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;}
}
- 启动keepalived和nginx服务。
systemctl start keepalived nginx
systemctl enable keepalived nginx
步骤2:存储层部署(nfs服务器:nfs服务端)
nfs安装nfs服务端,配置共享目录并设置权限。
- 安装nfs服务端。
yum install nfs-utils -y
- 配置共享目录并设置权限
# 创建共享目录
mkdir -p /data/html/kod
mkdir -p /data/html/myadmin
mkdir -p /data/html/discuz
# 编辑exports文件配置共享目录
vim /etc/exports
# 配置内容示例(原有配置不变)
/data 192.168.148.0/24(rw,sync,no_root_squash,no_all_squash)
- 启动nfs服务
systemctl start rpcbind.service
systemctl start nfs-server.service
systemctl enable rpcbind.service nfs-server.service
步骤3:应用层部署(web01、web02:nginx+php+nfs客户端)
web01和web02安装nginx、php和nfs客户端,配置nginx实现反向代理,配置php连接mysql数据库,配置nfs客户端挂载nfs服务器的共享目录,配置php-redis扩展安装和Redis缓存配置。
- 安装依赖
yum install nginx php-fpm php-cli php-xml php-gd php-mbstring.x86_64 php-mysqlnd.x86_64 php-pecl-zip.x86_64 php-process.x86_64 php-cli php-devel -y
yum install nfs-utils -y
- 挂载nfs共享目录(新增discuz挂载点,原有挂载保留)。
# 创建挂载点
mkdir -p /nginx/html/kod
mkdir -p /nginx/html/myadmin
mkdir -p /nginx/html/discuz
# 开启服务
systemctl start rpcbind.service# 开启自动挂载
vim /etc/fstab
192.168.148.166:/data/html /nginx/html nfs defaults 0 0# 开机自启
mount -a
- 创建网站nginx配置文件
# 新增discuz配置文件,kod和phpmyadmin 改个名就行
vim /etc/nginx/conf.d/discuz.conf
server {listen 80;server_name discuz.fsj.com;root /nginx/html/discuz ;index index.php index.html index.htm;location / {}location ~ \.php$ {fastcgi_pass unix:/run/php-fpm/www.sock;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;# 强制设置HTTPS为on,不用个别php代码会走http协议造成网页裸奔fastcgi_param HTTPS on;include fastcgi_params;}
}
- 部署业务程序
# 部署Discuz
cd /nginx/html/discuz
# 下载Discuz安装包(或从本地上传)
wget https://gitee.com/Discuz/DiscuzX/repository/archive/master.zip
unzip master.zip
mv DiscuzX-master/upload/* .
rm -rf master.zip DiscuzX-master
# 设置权限
chown -R nginx:nginx /nginx/html/discuz
- 安装php-redis扩展
# 下载redis扩展包,当前php无法支持yum自动安装,需要手动编译安装
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/
# 检查php编译环境
phpize
# 生成编译配置
./configure --with-php-config=/usr/bin/php-config
# 编译安装
make && make install
# 配置redis扩展
cp /etc/php.d/20-mbstring.ini /etc/php.d/20-redis.inivim /etc/php.d/20-redis.ini
# 修改为以下内容
; Enable redis extension module
extension=redis
- 配置php使用redis存储session(新增内容,来自
redis.md)。
vim /etc/php-fpm.d/www.conf
# 注释原有session配置,新增redis配置(redis无密码场景)
php_value[session.save_handler] = redis
php_value[session.save_path] = "tcp://192.168.148.171:6379"
- 重启服务生效。
systemctl restart php-fpm nginx
systemctl enable php-fpm nginx
步骤4:数据层部署(mysql服务端 + Redis服务端)
4.1 关系型数据库:mysql服务端部署
- 安装mysql服务端。
yum install mysql-server mysql -y
- 初始化mysql数据库并启动服务。
# 初始化mysql数据库
mysql_secure_installation
# 启动mysql服务
systemctl start mysqld
systemctl enable mysqld
- 创建数据库和用户,并授权给web01和web02
# 登录mysql
mysql -uroot -p
# 创建discuz专用数据库和用户 phpmyadmin 类似
create database discuz character set utf8mb4;
create user discuz@'%' identified by '123@qq.COM';
grant all on discuz.* to discuz@'%';
4.2 缓存层:Redis服务端部署
- 安装redis服务端(在192.168.148.171 redis服务器上执行)。
yum install redis -y
- 配置redis监听地址。
vim /etc/redis/redis.conf
# 修改bind配置,监听指定地址(根据需求调整)
bind 192.168.148.171 127.0.0.1
# 如果需要密码,取消注释requirepass配置
# requirepass 123@qq.COM
- 启动redis服务。
systemctl start redis
systemctl enable redis
- 验证redis服务正常。
# 测试redis连接
redis-cli -h 192.168.148.171
192.168.148.171:6379> KEYS *
(empty array)
192.168.148.171:6379> exit
步骤5:业务配置(以discuz为例)
- 完成Discuz网页安装:访问
https://discuz.fsj.com,按照向导安装,数据库填写192.168.148.167,用户discuz,密码123@qq.COM,完成安装。 - 配置Discuz使用Redis缓存:
vim /nginx/html/discuz/config/config_global.php
# 修改以下配置项,开启redis缓存
$_config['memory']['redis']['server'] = '192.168.148.171';
$_config['memory']['redis']['port'] = 6379;
- 重启web服务生效:
systemctl restart php-fpm nginx
四、架构对应关系说明
| 架构分层 | 对应部署步骤 | 组件清单 |
|---|---|---|
| 用户层 | 浏览器/客户端、VIP 192.168.148.170 | |
| 接入层 | 步骤1 | lb01、lb02(nginx+keepalived) |
| 应用层 | 步骤3 | web01、web02(nginx+php+discuz+kod+phpmyadmin) |
| 存储层 | 步骤2 | nfs服务器 |
| 数据层 | 步骤4 | mysql服务端、redis服务端 |
