当前位置: 首页 > news >正文

基于Docker的高可用WordPress集群部署:Nginx负载均衡+Mysql主从复制+ProxySQL读写分离

  • 负载均衡服务器(192.168.0.119):运行 Nginx,负责请求分发。
  • 主库服务器(192.168.0.118):运行 MySQL 主库、ProxySQL、WordPress 和 Nginx。
  • 从库服务器(192.168.0.117):运行 MySQL 从库、WordPress 和 Nginx。

1. 架构特点

  • MySQL 主从复制:主库(192.168.91.167)与从库(192.168.91.168)实现数据同步。
  • ProxySQL 读写分离:部署在主库服务器,优化数据库查询性能。
  • Nginx 负载均衡:分发请求到主库和从库的 WordPress 服务。
  • WordPress 文件共享:通过 NFS 共享 /data/wordpress/uploads 和 /data/nginx/ssl 目录。
  • 高可用设计:确保系统稳定性和性能优化。

2. 准备工作

2.1 所有服务器通用配置

确保所有服务器(192.168.91.167、192.168.91.168、192.168.91.169)已安装 Docker 和 Docker Compose。若未安装,请参考官方文档安装。

# 创建必要目录
sudo mkdir -p /data/{mysql/{data,conf},wordpress/{html,uploads},nginx/{conf,logs,ssl},proxysql/{conf,data}}# 设置 WordPress 目录权限(通常无需手动设置)
sudo chown -R 1000:1000 /data/wordpress/{html,uploads}

提示:目录权限需与容器内用户(通常 UID/GID 为 1000)匹配。

3. 主库服务器配置 (192.168.91.167)

3.1 创建 Docker Compose 文件

在主库服务器上创建 /Docker/docker-compose.yml

mkdir -p /Docker
cd /Docker
vim docker-compose.yml
version: '3.8'
services:mysql:image: hub.yumesakura.com/library/mysql:8.0container_name: docker-mysql-masterenvironment:MYSQL_ROOT_PASSWORD: 12345678MYSQL_DATABASE: wordpressMYSQL_USER: wordpressMYSQL_PASSWORD: 12345678volumes:- /data/mysql/data:/var/lib/mysql- /data/mysql/conf:/etc/mysql/conf.dports:- "3306:3306"restart: unless-stoppedcommand:- --server-id=1- --log-bin=mysql-bin- --binlog-format=ROW- --bind-address=0.0.0.0networks:- wp_networkproxysql:image: proxysql/proxysql:latestcontainer_name: proxysqlports:- "6032:6032"- "6033:6033"volumes:- /data/proxysql/conf/proxysql.cnf:/etc/proxysql.cnf- /data/proxysql/data:/var/lib/proxysqldepends_on:- mysqlnetworks:- wp_networkwordpress:image: hub.yumesakura.com/library/wordpress:php8.2-fpmenvironment:WORDPRESS_DB_HOST: proxysqlWORDPRESS_DB_PORT: 6033WORDPRESS_DB_USER: wordpressWORDPRESS_DB_PASSWORD: 12345678WORDPRESS_DB_NAME: wordpressvolumes:- /data/wordpress/html:/var/www/html- /data/wordpress/uploads:/var/www/html/wp-content/uploads- /data/wordpress/php.ini:/usr/local/etc/php/conf.d/custom.inidepends_on:- proxysqlnetworks:- wp_networknginx:image: hub.yumesakura.com/library/nginx:alpineports:- "80:80"- "443:443"volumes:- /data/nginx/conf:/etc/nginx/conf.d- /data/nginx/logs:/var/log/nginx- /data/wordpress/html:/var/www/html- /data/nginx/ssl:/etc/ssldepends_on:- wordpressnetworks:- wp_networknetworks:wp_network:driver: bridge

3.2 配置 ProxySQL 读写分离

创建 ProxySQL 配置文件 /data/proxysql/conf/proxysql.cnf

vim /data/proxysql/conf/proxysql.cnf
datadir="/var/lib/proxysql"
admin_variables=
{admin_credentials="admin:admin"mysql_ifaces="0.0.0.0:6032"
}
mysql_variables=
{threads=4max_connections=2048default_query_timeout=36000000interfaces="0.0.0.0:6033"monitor_username="monitor"monitor_password="12345678"
}
mysql_servers=
({ hostgroup_id=10, hostname="192.168.0.118", port=3306, status="ONLINE", weight=1000 },{ hostgroup_id=20, hostname="192.168.0.117", port=3306, status="ONLINE", weight=1000 }
)
mysql_replication_hostgroups=
({ writer_hostgroup=10, reader_hostgroup=20 }
)
mysql_query_rules=
({ rule_id=1, active=1, match_pattern="^SELECT.*FOR UPDATE", destination_hostgroup=10, apply=1 },{ rule_id=2, active=1, match_pattern="^SELECT", destination_hostgroup=20, apply=1 },{ rule_id=3, active=1, match_pattern="^INSERT", destination_hostgroup=10, apply=1 },{ rule_id=4, active=1, match_pattern="^UPDATE", destination_hostgroup=10, apply=1 },{ rule_id=5, active=1, match_pattern="^DELETE", destination_hostgroup=10, apply=1 }
)
mysql_users=
({ username="wordpress", password="12345678", active=1, default_hostgroup=10, default_schema="wordpress" }
)

3.3 配置 Nginx

创建 Nginx 配置文件 /data/nginx/conf/wordpress.conf

server {listen 80;server_name default_server;root /var/www/html;index index.php;access_log /var/log/nginx/wordpress.access.log;error_log /var/log/nginx/wordpress.error.log;location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {expires 30d;access_log off;try_files $uri =404;}location / {try_files $uri $uri/ /index.php?$args;}location ~ \.php$ {try_files $uri =404;fastcgi_split_path_info ^(.+\.php)(/.+)$;fastcgi_pass wordpress:9000;fastcgi_index index.php;include fastcgi_params;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;fastcgi_param PATH_INFO $fastcgi_path_info;}add_header X-Frame-Options "SAMEORIGIN";add_header X-Content-Type-Options "nosniff";add_header X-XSS-Protection "1; mode=block";

3.4 启动服务

docker-compose up -d

3.5 配置 MySQL 主从复制

进入 MySQL 容器:

docker exec -it docker-mysql-master mysql -uroot -p12345678

执行以下 SQL 创建复制用户(使用 copy 用户,密码 12345678):

CREATE USER 'copy'@'%' IDENTIFIED BY '12345678';
GRANT REPLICATION SLAVE ON *.* TO 'copy'@'%';
FLUSH PRIVILEGES;
SHOW MASTER STATUS;

记录输出的 File 和 Position 值,用于从库配置。

image

 

image

3.6 创建 ProxySQL 监控账户

在主库 MySQL 中执行:

CREATE USER 'monitor'@'%' IDENTIFIED BY '12345678';
GRANT REPLICATION SLAVE ON *.* TO 'monitor'@'%';
FLUSH PRIVILEGES;

提示:监控账户用于 ProxySQL 检查 MySQL 服务器状态和复制延迟。

4. 从库服务器配置 (192.168.0.117)

4.1 创建 Docker Compose 文件

在 /Docker 目录下创建 docker-compose.yml

version: '3.8'
services:mysql:image: hub.yumesakura.com/library/mysql:8.0container_name: docker-mysql-slaveenvironment:MYSQL_ROOT_PASSWORD: 12345678MYSQL_DATABASE: wordpressMYSQL_USER: wordpressMYSQL_PASSWORD: 12345678volumes:- /data/mysql/data:/var/lib/mysql- /data/mysql/conf:/etc/mysql/conf.dports:- "3306:3306"restart: unless-stoppedcommand:- --server-id=2- --relay-log=mysql-relay-bin- --read-only=1- --skip-slave-startnetworks:- wp_networkwordpress:image: hub.yumesakura.com/library/wordpress:php8.2-fpmenvironment:WORDPRESS_DB_HOST: 192.168.0.118WORDPRESS_DB_PORT: 6033WORDPRESS_DB_USER: wordpressWORDPRESS_DB_PASSWORD: 12345678WORDPRESS_DB_NAME: wordpressvolumes:- /data/wordpress/html:/var/www/html- /data/wordpress/uploads:/var/www/html/wp-content/uploads- /data/wordpress/php.ini:/usr/local/etc/php/conf.d/custom.inidepends_on:- mysqlnetworks:- wp_networknginx:image: hub.yumesakura.com/library/nginx:alpineports:- "80:80"- "443:443"volumes:- /data/nginx/conf:/etc/nginx/conf.d- /data/nginx/logs:/var/log/nginx- /data/wordpress/html:/var/www/html- /data/nginx/ssl:/etc/ssldepends_on:- wordpressnetworks:- wp_networknetworks:wp_network:driver: bridge

4.2 配置 Nginx

创建与主库服务器相同的 /data/nginx/conf/wordpress.conf(内容同 3.3 节)。

4.3 启动服务

docker-compose up -d

4.4 配置 MySQL 从库复制

进入从库 MySQL 容器:

docker exec -it docker-mysql-slave mysql -uroot -p12345678

执行以下 SQL(替换 MASTER_LOG_FILE 和 MASTER_LOG_POS 为 3.5 节记录的值):

CHANGE MASTER TOMASTER_HOST='192.168.0.118',MASTER_USER='copy',MASTER_PASSWORD='12345678',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=1234;
START SLAVE;
SHOW SLAVE STATUS\G

确认 Slave_IO_Running 和 Slave_SQL_Running 均为 Yes.

5. 负载均衡服务器配置 (192.168.0.119)

5.1 创建 Docker Compose 文件

在 /Docker 目录下创建 docker-compose.yml

version: '3.8'
services:nginx:image: nginx:alpinecontainer_name: load-balancerports:- "80:80"- "443:443"volumes:- /data/nginx/conf:/etc/nginx/conf.d- /data/nginx/logs:/var/log/nginx- /data/nginx/ssl:/etc/sslnetworks:- wp_networknetworks:wp_network:driver: bridge

5.2 配置 Nginx 负载均衡

创建 /data/nginx/conf/load-balancer.conf

upstream wordpress_backend {server 192.168.0.118:80 weight=1;server 192.168.0.117:80 weight=1;keepalive 64;
}server {listen 80;server_name yourdomain.com;access_log /var/log/nginx/lb.access.log;error_log /var/log/nginx/lb.error.log;location / {proxy_pass http://wordpress_backend;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_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_http_version 1.1;proxy_redirect off;proxy_buffering off;}
}

5.3 启动服务

docker-compose up -d

6. 文件共享配置 (NFS)

为确保 WordPress 文件一致性,通过 NFS 共享以下目录:

  • /data/wordpress/uploads:WordPress 上传文件
  • /data/nginx/ssl:SSL 证书

6.1 NFS 服务端配置(主库服务器 192.168.0.118)

# 安装 NFS 服务
sudo apt-get install -y nfs-kernel-server# 配置 NFS 共享
sudo vim /etc/exports

添加以下内容:

/data/wordpress/uploads  *(rw,sync,no_subtree_check,no_root_squash)
/data/nginx/ssl          *(rw,sync,no_subtree_check,no_root_squash)

生效配置:

sudo exportfs -a
sudo systemctl restart nfs-kernel-server

6.2 NFS 客户端配置(从库服务器 192.168.0.117)

# 安装 NFS 客户端
sudo apt-get install -y nfs-common# 挂载 NFS 共享
sudo mount -t nfs 192.168.0.118:/data/wordpress/uploads /data/wordpress/uploads
sudo mount -t nfs 192.168.0.118:/data/nginx/ssl /data/nginx/ssl# 验证挂载
df -h | grep nfs

6.3 配置开机自动挂载

在从库服务器上编辑 /etc/fstab

sudo vim /etc/fstab

添加以下内容:

192.168.0.118:/data/wordpress/uploads  /data/wordpress/uploads  nfs  defaults,_netdev,noatime  0  0
192.168.0.118:/data/nginx/ssl          /data/nginx/ssl          nfs  defaults,_netdev,noatime  0  0

测试挂载:

sudo mount -a
df -h | grep -E 'uploads|ssl'

提示:若挂载失败,检查 NFS 服务器状态或添加 x-systemd.automount 选项。

7. 验证配置

7.1 验证 MySQL 主从复制

在主库服务器:

docker exec -it docker-mysql-master mysql -uroot -p12345678 -e "SHOW MASTER STATUS;"

在从库服务器:

docker exec -it docker-mysql-slave mysql -uroot -p12345678 -e "SHOW SLAVE STATUS\G"

7.2 验证 ProxySQL 读写分离

进入 ProxySQL 管理界面:

docker exec -it proxysql mysql -uadmin -padmin -h127.0.0.1 -P6032

执行以下命令检查配置:

SELECT * FROM mysql_servers;
SELECT * FROM mysql_replication_hostgroups;
SELECT * FROM mysql_query_rules;
SELECT * FROM stats_mysql_connection_pool;

7.3 验证负载均衡

访问负载均衡服务器(192.168.0.119)或绑定域名,多次刷新页面,检查日志确认请求分发:

tail -f /data/nginx/logs/wordpress.access.log

7.4 验证 NFS 共享

  1. 在 WordPress 后台上传图片,检查所有节点的 /data/wordpress/uploads 是否同步。
  2. 更新主库服务器的 /data/nginx/ssl 证书,确认所有 Nginx 容器可访问最新证书。

8. 常见 ProxySQL 命令

进入 ProxySQL 命令行:

docker exec -it proxysql mysql -uadmin -padmin -h127.0.0.1 -P6032

常用命令:

SELECT * FROM mysql_query_rules;  -- 查看查询规则
SELECT * FROM mysql_servers;      -- 查看后端服务器
SELECT * FROM mysql_replication_hostgroups;  -- 查看主从配置
SELECT * FROM stats_mysql_connection_pool;   -- 查看连接池状态
SELECT * FROM stats_mysql_query_rules;       -- 查看规则命中统计
SELECT * FROM monitor.mysql_server_ping_log ORDER BY time_start_us DESC LIMIT 3;  -- 检查后端健康状态

9. 注意事项

  • 密码安全:生产环境中请使用强密码替换 12345678
  • 网络配置:确保服务器间网络畅通,防火墙开放必要端口(80、443、3306、6032、6033)。
  • NFS 可靠性:生产环境建议使用 systemd.automount 或高可用 NFS 方案。
  • 备份策略:定期备份 MySQL 数据和 WordPress 文件。

附录:带注释的 Docker Compose 文件

注意:生产环境建议使用简洁版 docker-compose.yml,避免注释导致解析问题。以下仅供学习参考。

主库服务器注释版

version: '3.8'
services:mysql:image: hub.yumesakura.com/library/mysql:8.0container_name: docker-mysql-masterenvironment:# 设置 MySQL root 用户密码MYSQL_ROOT_PASSWORD: 12345678# 创建默认数据库MYSQL_DATABASE: wordpress# 创建普通用户MYSQL_USER: wordpress# 设置普通用户密码MYSQL_PASSWORD: 12345678volumes:# 持久化 MySQL 数据- /data/mysql/data:/var/lib/mysql# 挂载配置文件目录- /data/mysql/conf:/etc/mysql/conf.dports:- "3306:3306"restart: unless-stoppedcommand:# 主库 ID- --server-id=1# 启用二进制日志- --log-bin=mysql-bin# 设置日志格式- --binlog-format=ROW# 允许外部连接- --bind-address=0.0.0.0networks:- wp_network# 其他服务配置略(与简洁版相同)
networks:wp_network:driver: bridge

从库服务器注释版:(类似主库,略)

http://www.dtcms.com/a/343898.html

相关文章:

  • Unreal Engine UFloatingPawnMovement
  • SpringBoot集成ELK
  • 【Dubbo】高性能的 RPC
  • 零基础从头教学Linux(Day 18)
  • Slither 审计自己写的智能合约
  • 《R for Data Science (2e)》免费中文翻译 (第5章) --- Data tidying
  • 园区 “一表多属” 电仪表能碳数据归集与编码实施文档
  • 《LINUX系统编程》笔记p3
  • 赛灵思ZYNQ官方文档UG585自学翻译笔记与代码示例:XILINX UART控制器详解:特性与功能
  • 新手向:计算机视觉入门OpenCV实战项目
  • elasticsearch 7.x elasticsearch 使用scroll滚动查询一页,删除一页,影响后面滚动的查询吗
  • 【LeetCode热题100道笔记+动画】最大子数组和
  • 任务同步和锁
  • 基于django/python的服装销售系统平台/服装购物系统/基于django/python的服装商城
  • sqli-labs通关笔记-第61关 GET字符型报错注入(单引号双括号闭合 限制5次探测机会)
  • 基于Django的学校实验室预约管理系统/基于python的实验室管理系统的设计与实现#python#django#FLASK
  • JAVA基础-java虚拟机
  • uniapp googlepay支付 内购项目
  • 豆包AI PPT与秒出PPT对比评测:谁更适合你?
  • 计算机毕设选题推荐 基于Spark的家庭能源消耗智能分析与可视化系统 基于机器学习的家庭能源消耗预测与可视化系统源码
  • Python办公之Excel(openpyxl)、PPT(python-pptx)、Word(python-docx)
  • 2026年计算机毕设推荐:基于大数据的慢性肾病数据可视化分析系统技术选型指南【Hadoop、spark、python】
  • 使用PPT进行科研绘图过程中常用的快捷键
  • 日志logging学习(1)
  • Gemini 2.5 Flash-Lite与 DeepSeek-V3 深度对比:谁在性价比上更胜一筹?
  • 【typenum】 21 类型级别计算最大公约数(Gcd)
  • map和set的使⽤
  • 52 C++ 现代C++编程艺术1-禁止隐式转换关键字explicit
  • Qt中用于图像缩放的核⼼⽅法QPixmap::scaled
  • 编写Linux下设备驱动时两种方案:内核态驱动开发和用户态驱动开发