单台 WordPress 服务器 QPS 超过 500 就开始吃力,日访问量百万级怎么办?本教程介绍完整的高可用 WordPress 集群架构,支持水平扩展、自动故障转移、负载均衡,轻松承载千万级流量。
一、架构设计
传统单点架构:
用户 → 单台服务器(Nginx+PHP+MySQL)
高可用集群架构:
→ 负载均衡器 1(主)
用户 → DNS/LB → 负载均衡器 2(备) → Web 服务器 1
↓ → Web 服务器 2
↓ → Web 服务器 N
→ 数据库集群(主从复制)
→ Redis 集群(会话缓存)
→ NFS/对象存储(共享文件)
二、核心组件选型
1. 负载均衡器
- Nginx + Keepalived(推荐,简单可靠)
- HAProxy(功能强大)
- LVS(性能最强,配置复杂)
- 云服务商 LB(阿里云 SLB/腾讯云 CLB)
2. 数据库
- MySQL 主从复制 + MHA(经典方案)
- MySQL Group Replication(官方高可用)
- Galera Cluster(多主集群)
- 云数据库 RDS(省事)
3. 会话共享
- Redis Cluster(推荐)
- Memcached(老牌选择)
- 数据库(不推荐,性能差)
4. 文件共享
- NFS(简单,单点故障)
- GlusterFS(分布式,复杂)
- 对象存储(阿里云 OSS/腾讯云 COS,推荐)
三、部署实施
环境规划:
LB01: 192.168.1.10(Nginx+Keepalived,VIP: 192.168.1.100) LB02: 192.168.1.11(Nginx+Keepalived,备) Web01: 192.168.1.20(WordPress+Nginx+PHP) Web02: 192.168.1.21(WordPress+Nginx+PHP) DB01: 192.168.1.30(MySQL 主) DB02: 192.168.1.31(MySQL 从) Redis: 192.168.1.40(Redis Cluster)
四、配置 Keepalived 高可用
# 在 LB01 和 LB02 上安装
apt install keepalived -y
# LB01 配置(MASTER)
cat > /etc/keepalived/keepalived.conf << 'EOF'
variable "ROLE" {
value = "MASTER" # LB02 设置为 BACKUP
}
vrrp_script chk_nginx {
script "killall -0 nginx"
interval 2
fall 3
rise 1
}
vrrp_instance VI_1 {
state MASTER # LB02 为 BACKUP
interface eth0
virtual_router_id 51
priority 100 # LB02 设置为 99
advert_int 1
authentication {
auth_type PASS
auth_pass your_password
}
virtual_ipaddress {
192.168.1.100 # VIP
}
track_script {
chk_nginx
}
notify_master "/etc/keepalived/master.sh"
notify_backup "/etc/keepalived/backup.sh"
}
EOF
systemctl enable keepalived
systemctl start keepalived
五、Nginx 负载均衡配置
cat > /etc/nginx/conf.d/upstream.conf << 'EOF'
upstream wordpress_cluster {
least_conn; # 最少连接数算法
server 192.168.1.20:80 weight=1 max_fails=3 fail_timeout=30s;
server 192.168.1.21:80 weight=1 max_fails=3 fail_timeout=30s;
# 会话保持(Cookie sticky)
# hash $cookie_WP_SESSION consistent;
keepalive 32;
}
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://wordpress_cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 超时设置
proxy_connect_timeout 5s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}
EOF
nginx -t
systemctl reload nginx
六、WordPress 集群配置
步骤 1:配置数据库主从复制
# 在主库 DB01 上
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog_format = ROW
# 创建复制用户
CREATE USER 'repl'@'192.168.1.%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.%';
# 在从库 DB02 上
[mysqld]
server-id = 2
read_only = 1
# 配置复制
CHANGE MASTER TO
MASTER_HOST='192.168.1.30',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=1234;
START SLAVE;
步骤 2:配置 WordPress 使用 Redis 会话
# 安装 Redis 对象缓存插件
wp plugin install redis-cache --activate
# 配置 wp-config.php
define('WP_REDIS_HOST', '192.168.1.40');
define('WP_REDIS_PORT', 6379);
define('WP_REDIS_DATABASE', 0);
define('WP_REDIS_PASSWORD', 'your_redis_password');
define('WP_REDIS_PREFIX', 'yourdomain');
# 启用会话存储到 Redis
ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://192.168.1.40:6379?database=1');
步骤 3:配置文件共享
# 方案 A:使用 NFS # Web01, Web02 挂载共享目录 mount -t nfs 192.168.1.50:/exports/wp-uploads /var/www/html/wp-content/uploads # 方案 B:使用对象存储(推荐) # 安装 WP Offload Media 插件 # 配置阿里云 OSS/腾讯云 COS 密钥 # 自动上传媒体文件到云端
七、数据库读写分离
# 使用 HyperDB 插件实现读写分离
# db.php 配置
$wpdb->add_callback('write', function($query){
return 'db_cluster_write';
});
$wpdb->add_callback('read', function($query){
return 'db_cluster_read';
});
# 配置数据库服务器
$db_servers = array(
'write' => array(
array('host' => '192.168.1.30', 'port' => 3306), # 主库
),
'read' => array(
array('host' => '192.168.1.31', 'port' => 3306), # 从库 1
array('host' => '192.168.1.32', 'port' => 3306), # 从库 2
),
);
八、监控和告警
# 安装 Prometheus Exporter
# Nginx VTS module
# MySQL Exporter
# Redis Exporter
# 配置告警规则
- alert: WebServerDown
expr: up{job="nginx"} == 0
for: 1m
- alert: DatabaseReplicationLag
expr: mysql_slave_seconds_behind_master > 60
for: 5m
- alert: LoadBalancerFailover
expr: keepalived_state == "BACKUP"
for: 1m
九、性能测试
# 使用 Apache Bench 测试 ab -n 10000 -c 100 https://yourdomain.com/ # 使用 wrk 测试 wrk -t12 -c400 -d30s https://yourdomain.com/ # 目标指标 # - 单 Web 服务器:QPS 1000+ # - 集群(3 台):QPS 3000+ # - 响应时间:P99 < 200ms # - 错误率:< 0.1%
十、我踩过的坑
坑 1:会话不同步
用户在一台服务器登录,下次请求到另一台服务器发现未登录。解决:使用 Redis 统一存储会话。
坑 2:上传文件丢失
图片上传到 Web01,下次访问路由由 Web02 处理,发现图片不存在。解决:使用 NFS 或对象存储共享文件。
坑 3:���据库死锁
高并发下数据库出现死锁。解决:优化 SQL 查询,使用 Redis 缓存热点数据,数据库连接池配置合理。
坑 4:缓存穿透
大量请求同时访问不存在的数据,缓存未命中直接打到数据库。解决:布隆过滤器,缓存空值。
总结
高可用 WordPress 集群架构虽然复杂,但带来的收益是巨大的:
- ✅ 承载千万级日访问量
- ✅ 自动故障转移,服务不中断
- ✅ 水平扩展,按需增加服务器
- ✅ 读写分离,数据库性能提升
- ✅ 会话共享,用户体验一致
对于大中型网站,这套架构是必选方案。
来源:https://mjj.728.hk/