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

本教程指导您在 Docker 环境中部署一个高可用、高性能的 WordPress 网站,包含以下组件:

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

架构图

images

1. 架构特点

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

2. 准备工作

2.1 所有服务器通用配置

确保所有服务器(192.168.0.117、192.168.0.118、192.168.0.119)已安装 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.0.118)

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.0
    container_name: docker-mysql-master
    environment:
      MYSQL_ROOT_PASSWORD: 12345678
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: 12345678
    volumes:
      - /data/mysql/data:/var/lib/mysql
      - /data/mysql/conf:/etc/mysql/conf.d
    ports:
      - "3306:3306"
    restart: unless-stopped
    command:
      - --server-id=1
      - --log-bin=mysql-bin
      - --binlog-format=ROW
      - --bind-address=0.0.0.0
    networks:
      - wp_network

  proxysql:
    image: proxysql/proxysql:latest
    container_name: proxysql
    ports:
      - "6032:6032"
      - "6033:6033"
    volumes:
      - /data/proxysql/conf/proxysql.cnf:/etc/proxysql.cnf
      - /data/proxysql/data:/var/lib/proxysql
    depends_on:
      - mysql
    networks:
      - wp_network

  wordpress:
    image: hub.yumesakura.com/library/wordpress:php8.2-fpm
    environment:
      WORDPRESS_DB_HOST: proxysql
      WORDPRESS_DB_PORT: 6033
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: 12345678
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - /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.ini
    depends_on:
      - proxysql
    networks:
      - wp_network

  nginx:
    image: hub.yumesakura.com/library/nginx:alpine
    ports:
      - "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/ssl
    depends_on:
      - wordpress
    networks:
      - wp_network

networks:
  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=4
    max_connections=2048
    default_query_timeout=36000000
    interfaces="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;

记录输出的 FilePosition 值,用于从库配置。

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.0
    container_name: docker-mysql-slave
    environment:
      MYSQL_ROOT_PASSWORD: 12345678
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: 12345678
    volumes:
      - /data/mysql/data:/var/lib/mysql
      - /data/mysql/conf:/etc/mysql/conf.d
    ports:
      - "3306:3306"
    restart: unless-stopped
    command:
      - --server-id=2
      - --relay-log=mysql-relay-bin
      - --read-only=1
      - --skip-slave-start
    networks:
      - wp_network

  wordpress:
    image: hub.yumesakura.com/library/wordpress:php8.2-fpm
    environment:
      WORDPRESS_DB_HOST: 192.168.0.118
      WORDPRESS_DB_PORT: 6033
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: 12345678
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - /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.ini
    depends_on:
      - mysql
    networks:
      - wp_network

  nginx:
    image: hub.yumesakura.com/library/nginx:alpine
    ports:
      - "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/ssl
    depends_on:
      - wordpress
    networks:
      - wp_network

networks:
  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_FILEMASTER_LOG_POS 为 3.5 节记录的值):

CHANGE MASTER TO
  MASTER_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_RunningSlave_SQL_Running 均为 Yes.

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

5.1 创建 Docker Compose 文件

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

version: '3.8'
services:
  nginx:
    image: nginx:alpine
    container_name: load-balancer
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /data/nginx/conf:/etc/nginx/conf.d
      - /data/nginx/logs:/var/log/nginx
      - /data/nginx/ssl:/etc/ssl
    networks:
      - wp_network

networks:
  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.0
    container_name: docker-mysql-master
    environment:
      # 设置 MySQL root 用户密码
      MYSQL_ROOT_PASSWORD: 12345678
      # 创建默认数据库
      MYSQL_DATABASE: wordpress
      # 创建普通用户
      MYSQL_USER: wordpress
      # 设置普通用户密码
      MYSQL_PASSWORD: 12345678
    volumes:
      # 持久化 MySQL 数据
      - /data/mysql/data:/var/lib/mysql
      # 挂载配置文件目录
      - /data/mysql/conf:/etc/mysql/conf.d
    ports:
      - "3306:3306"
    restart: unless-stopped
    command:
      # 主库 ID
      - --server-id=1
      # 启用二进制日志
      - --log-bin=mysql-bin
      # 设置日志格式
      - --binlog-format=ROW
      # 允许外部连接
      - --bind-address=0.0.0.0
    networks:
      - wp_network
  # 其他服务配置略(与简洁版相同)
networks:
  wp_network:
    driver: bridge

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

梦葉樱 all right reserved,powered by Gitbook该文件最后修改时间: 2025-08-07 09:36:02

results matching ""

    No results matching ""