docker架构

架构


2. 创建项目结构

shell 复制代码
# 创建项目目录
mkdir wordpress-distributed && cd wordpress-distributed
mkdir nginx-config redis-config

3. 创建 docker-compose.yml

yaml 复制代码
# docker-compose.yml
version: '3.8'

services:
  # Nginx 负载均衡 + 反向代理
  nginx:
    image: nginx:stable-alpine-perl
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx-config/default.conf:/etc/nginx/conf.d/default.conf
      - ./nginx-config/nginx.conf:/etc/nginx/nginx.conf
      - wordpress-data:/var/www/html
    depends_on:
      - wordpress1
      - wordpress2
    networks:
      - wordpress-network

  # WordPress 实例 1(可水平扩展)
  wordpress1:
    image: wordpress:php8.4-fpm-alpine
    volumes:
      - wordpress-data:/var/www/html
      - ./php-config/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
    environment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_TABLE_PREFIX: wp_
      REDIS_HOST: redis
    networks:
      - wordpress-network
    deploy:
      resources:
        limits:
          memory: 512M
          cpus: '0.5'

  # WordPress 实例 2(负载均衡)
  wordpress2:
    image: wordpress:php8.4-fpm-alpine
    volumes:
      - wordpress-data:/var/www/html
      - ./php-config/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
    environment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_TABLE_PREFIX: wp_
      REDIS_HOST: redis
    networks:
      - wordpress-network
    deploy:
      resources:
        limits:
          memory: 512M
          cpus: '0.5'

  # MySQL 数据库(共享)
  mysql:
    image: mysql:8.0-debian
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: ${DB_PASSWORD}
    volumes:
      - mysql-data:/var/lib/mysql
      - ./mysql-config/my.cnf:/etc/mysql/my.cnf
    command:
      - --default-authentication-plugin=mysql_native_password
      - --innodb_buffer_pool_size=512M
    networks:
      - wordpress-network

  # Redis 缓存(共享)
  redis:
    image: redis:alpine
    command:
      - redis-server
      - --appendonly yes
      - --requirepass ${REDIS_PASSWORD}
      - --maxmemory 256mb
      - --maxmemory-policy allkeys-lru
    volumes:
      - redis-data:/data
      - ./redis-config/redis.conf:/etc/redis/redis.conf
    networks:
      - wordpress-network

volumes:
  wordpress-data:
  mysql-data:
  redis-data:

networks:
  wordpress-network:
    driver: bridge

4. 创建 Nginx 负载均衡配置

shell 复制代码
# 创建 Nginx 主配置
cat > nginx-config/nginx.conf << 'EOF'
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    
    # 上游 WordPress 服务器组
    upstream wordpress_backend {
        least_conn;  # 最少连接负载均衡
        server wordpress1:9000 weight=3;
        server wordpress2:9000 weight=2;
        keepalive 32;
    }
    
    include /etc/nginx/conf.d/*.conf;
}
EOF

# 创建站点配置
cat > nginx-config/default.conf << 'EOF'
server {
    listen 80;
    server_name _;
    root /var/www/html;
    index index.php;

    # 静态文件缓存
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
        expires 365d;
        access_log off;
        add_header Cache-Control "public, immutable";
        try_files $uri =404;
    }

    # WordPress 路由
    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    # PHP 负载均衡
    location ~ \.php$ {
        fastcgi_pass wordpress_backend;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_keep_conn on;
        fastcgi_intercept_errors on;
    }

    # 安全设置
    location ~ /\.ht {
        deny all;
    }
    
    location ~* (\.env|wp-config\.php|composer\.json)$ {
        deny all;
    }
}
EOF

5. 创建配置文件

复制代码
# 创建环境变量文件
cat > .env << 'EOF'
DB_ROOT_PASSWORD=your_mysql_root_password_123
DB_PASSWORD=your_mysql_wp_password_456
REDIS_PASSWORD=your_redis_password_789
EOF

# PHP 配置
mkdir php-config
cat > php-config/uploads.ini << 'EOF'
file_uploads = On
upload_max_filesize = 64M
post_max_size = 128M
max_execution_time = 300
memory_limit = 256M
EOF

# MySQL 配置
mkdir mysql-config
cat > mysql-config/my.cnf << 'EOF'
[mysqld]
innodb_buffer_pool_size = 512M
innodb_log_file_size = 256M
max_connections = 100
query_cache_type = 1
query_cache_size = 64M
slow_query_log = 1
EOF

# Redis 配置
mkdir redis-config
cat > redis-config/redis.conf << 'EOF'
bind 0.0.0.0
port 6379
requirepass your_redis_password_789
maxmemory 256mb
maxmemory-policy allkeys-lru
appendonly yes
appendfsync everysec
EOF

6. 启动分布式架构

复制代码
# 启动所有服务
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看负载均衡状态
docker-compose logs nginx | grep -i "upstream"

7. 验证分布式架构

复制代码
# 检查所有容器运行状态
docker-compose ps

# 测试负载均衡
curl -I http://localhost

# 检查 Redis 连接
docker-compose exec redis redis-cli -a your_redis_password_789 ping

# 检查 MySQL 连接
docker-compose exec mysql mysql -u wpuser -pyour_mysql_wp_password_456 -e "SELECT @@version;"

8. WordPress 安装和配置

  1. 访问 http://你的服务器IP完成 WordPress 安装

  2. 安装 Redis 缓存插件(如 "Redis Object Cache")

  3. wp-config.php中添加 Redis 配置:

    复制代码
    // Redis 分布式缓存配置
    define('WP_REDIS_HOST', 'redis');
    define('WP_REDIS_PORT', 6379);
    define('WP_REDIS_PASSWORD', 'your_redis_password_789');
    define('WP_REDIS_TIMEOUT', 1);
    define('WP_REDIS_READ_TIMEOUT', 1);
    define('WP_REDIS_SELECTIVE_FLUSH', true);

9. 扩展和管理命令

复制代码
# 扩展更多 WordPress 实例
docker-compose up -d --scale wordpress=4

# 查看各实例资源使用
docker stats $(docker ps -q --filter name=wordpress)

# 重启特定服务
docker-compose restart wordpress1

# 更新配置后重载 Nginx
docker-compose exec nginx nginx -s reload

# 备份数据库
docker-compose exec mysql mysqldump -u root -p$DB_ROOT_PASSWORD wordpress > backup.sql

10. 监控和优化

复制代码
# 监控 Nginx 访问日志
docker-compose logs -f nginx | grep "wordpress"

# 检查 PHP-FPM 状态
docker-compose exec wordpress1 curl http://localhost/status

性能测试

复制代码
# 使用 ab 进行压力测试
ab -n 1000 -c 10 http://你的服务器IP/

11.项目最终结构

复制代码
wordpress-distributed/
├── docker-compose.yml
├── .env
├── nginx-config/
│   ├── nginx.conf
│   └── default.conf
├── php-config/
│   └── uploads.ini
├── mysql-config/
│   └── my.cnf
├── redis-config/
│   └── redis.conf
└── README.md
相关推荐
会周易的程序员2 分钟前
microLog 的 log_reader 架构解析:嵌入式日志检索引擎的设计之道
c++·物联网·架构·日志·iot·aiot
咕噜咕噜的猪大侠5 分钟前
《K8s 核心知识梳理:Deployment 滚动更新、JobCronJob、DaemonSet 和 Service》
云原生·容器·kubernetes
Geek-Chow11 分钟前
微服务认证与授权:08 — OPA(PDP)
微服务·云原生·架构
阿标在干嘛13 分钟前
100+微服务的统一出入口:政策快报平台的API网关设计
微服务·云原生·架构
万联WANFLOW14 小时前
SD-WAN 控制平面高可用怎么做?SDWAN 控制器挂了,全网会发生什么
运维·网络·分布式·架构
踩着两条虫14 小时前
可视化 vs 终端 vs 云端:VTJ.PRO、Claude Code、Codex 三强横评
前端·vue.js·人工智能·低代码·架构
Fabarta14 小时前
从 0 实现 ChatGPT 风格的流式对话 UI
算法·架构
程序员老油条15 小时前
WSL2 + Docker Desktop:Windows 下的完美 Java 开发环境
java·windows·docker·wsl2
搭贝15 小时前
低代码平台私有化部署架构与信创全栈适配实战
低代码·架构·rxjava
学渣超16 小时前
记一次分布式事务数据不一致的排查之旅:从超时到索引,层层剥茧
java·后端·架构