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
相关推荐
天空属于哈夫克34 天前
企业微信二次开发:精准实现关键词自动回复
架构·企业微信
虎头金猫4 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
分布式存储与RustFS4 天前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
晨米酱4 天前
AGENTS.md:Agent 的上下文策略层
面试·架构·agent
这个DBA有点耶4 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
码流子4 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
玉&心4 天前
通过Arthas在线诊断K8S中的内存及JVM等使用情况
docker·k8s·arthas
moMo4 天前
从固定流程到问题路由:让 LangGraph RAG 按需检索
架构
xing-xing4 天前
Docker容器中Nginx站点根目录网页配置访问
nginx·docker
赵文宇(温玉)4 天前
CoreDNS的hosts插件的缺行配置导致k8s集群异常
容器·kubernetes·rancher