Docker Compose 部署 WordPress(Nginx + MariaDB + Redis + WordPress)

Docker Compose 部署 WordPress(Nginx + MariaDB + Redis + WordPress)

_

Docker Compose 部署 WordPress(Nginx + MariaDB + Redis + WordPress)

1. 部署环境

  • 操作系统:Ubuntu 22.04 Server 64bit

2. docker-compose.yml

# docker-compose.yml

services:
  nginx:
    depends_on:
      - wordpress
    image: nginx:latest
    container_name: nginx
    restart: always

    volumes:
      - ${PWD}/data/nginx/conf.d:/etc/nginx/conf.d        # Nginx 配置目录
      - ${PWD}/data/nginx/nginx.conf:/etc/nginx/nginx.conf # 主配置文件
      - ${PWD}/data/nginx/ssl:/etc/nginx/ssl               # SSL 证书目录
      - ${PWD}/data/nginx/html:/etc/nginx/html             # 静态资源目录(可选)
      - ${PWD}/data/nginx/logs:/var/log/nginx              # 日志目录

    environment:
      TZ: Asia/Shanghai

    ports:
      - "80:80"
      - "443:443"

    networks:
      - wordpress_network

  mariadb:
    image: mariadb:10
    container_name: mariadb
    restart: always

    volumes:
      - ${PWD}/data/mariadb/conf:/etc/mysql/conf.d
      - ${PWD}/data/mariadb/logs:/logs
      - wordpress-db-data:/var/lib/mysql

    environment:
      MARIADB_DATABASE: wordpress           # 数据库名称
      MARIADB_USER: wordpress               # 数据库用户名(建议更改)
      MARIADB_PASSWORD: wordpress           # 数据库用户密码(建议更改)
      MARIADB_ROOT_PASSWORD: "123456"       # ROOT 密码(强烈建议更改)
      TZ: Asia/Shanghai

    ports:
      - "3306:3306"

    networks:
      - wordpress_network

  redis:
    image: redis
    container_name: redis
    restart: always

    volumes:
      - ${PWD}/data/redis/log/redis.log:/etc/redis.log          # 日志文件
      - ${PWD}/data/redis/conf/redis.conf:/etc/redis/redis.conf # 配置文件
      - ${PWD}/data/redis/data:/data                            # 持久化数据

    networks:
      - wordpress_network

  wordpress:
    depends_on:
      - mariadb
      - redis
    image: wordpress:latest
    container_name: wordpress
    restart: always

    volumes:
      - ${PWD}/data/wordpress/html:/var/www/html                              # WordPress 根目录
      - ${PWD}/data/wordpress/php/upload.ini:/usr/local/etc/php/conf.d/upload.ini # PHP 上传限制配置

    environment:
      WORDPRESS_DB_HOST: mariadb
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
      TZ: Asia/Shanghai

    networks:
      - wordpress_network

networks:
  wordpress_network:

volumes:
  wordpress-db-data:

⚠️ 安全提示:请务必修改数据库用户名、密码及 ROOT 密码!


3. Nginx 配置

3.1 nginx.conf

路径:./data/nginx/nginx.conf

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;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    keepalive_timeout  65;
    client_max_body_size 100m;

    server_tokens off;

    include /etc/nginx/conf.d/*.conf;
}

3.2 wordpress.conf

路径:./data/nginx/conf.d/wordpress.conf

# HTTPS 配置(施工中)
server {
    listen 443 ssl;
    server_name <your-domain.com>;  # 替换为你的域名

    ssl_certificate       /etc/nginx/ssl/<your-domain>.crt;
    ssl_certificate_key   /etc/nginx/ssl/<your-domain>.key;

    ssl_session_timeout 5m;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_prefer_server_ciphers on;

    gzip on;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    location / {
        proxy_pass         http://wordpress;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;

        add_header X-Content-Type-Options nosniff;
        add_header Content-Security-Policy "upgrade-insecure-requests" always;

        client_max_body_size 100m;
    }
}

# HTTP 重定向(可选开启 HTTPS 强制跳转)
server {
    listen 80;
    server_name <your-domain.com>;

    # rewrite ^(.*)$ https://$host$1 permanent;  # 取消注释以强制跳转 HTTPS

    gzip on;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    location / {
        proxy_pass         http://wordpress;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;

        client_max_body_size 100m;
    }
}

📌 注意:确保删除或注释掉 ./data/nginx/conf.d/default.conf,否则可能覆盖自定义配置。


4. Redis 配置

4.1 创建日志文件

mkdir -p ./data/redis/log
touch ./data/redis/log/redis.log

4.2 下载并配置 redis.conf

从官方下载配置模板:

curl -o ./data/redis/conf/redis.conf http://download.redis.io/redis-stable/redis.conf

编辑 ./data/redis/conf/redis.conf,关键配置如下:

bind 0.0.0.0
protected-mode no
daemonize no
logfile "/etc/redis.log"
maxmemory 1gb
maxmemory-policy allkeys-lru
save 900 1

4.3 设置权限

chmod 777 ./data/redis/conf/redis.conf ./data/redis/log/redis.log

4.4 WordPress 启用 Redis 缓存

4.4.1 修改 wp-config.php

./data/wordpress/html/wp-config.php 中,require_once ABSPATH . 'wp-settings.php'; 之前添加:

// 启用 Redis 缓存
define('WP_CACHE_KEY_SALT', 'your_domain:');  // 替换为你的域名
define('WP_REDIS_HOST', 'redis');
define('WP_REDIS_PORT', 6379);
define('WP_REDIS_TIMEOUT', 1);
define('WP_REDIS_READ_TIMEOUT', 1);
define('WP_REDIS_DATABASE', 0);

4.4.2 安装插件

  • 在 WordPress 后台 → 插件 → 搜索 Redis Object Cache
  • 安装并启用
  • 进入插件设置页面,点击 Enable Object Cache

🔗 官方安装指南


5. HTTPS / SSL(施工中)

  • 推荐使用 Let's Encrypt 自动签发证书(可通过 certbot 或 Traefik 实现)
  • 或使用 Really Simple SSL 插件辅助配置
  • 调试混合内容问题:How to track down mixed content

6. 解除 WordPress 文件上传限制

创建文件:./data/wordpress/php/upload.ini

file_uploads = On
memory_limit = 500M
upload_max_filesize = 100M
post_max_size = 100M
max_execution_time = 600

该配置通过 volume 挂载到容器内,自动生效。


7. 启动与停止脚本

run.sh

#!/bin/bash
docker compose -p wordpress up -d

down.sh

#!/bin/bash
docker compose down

赋予执行权限:

chmod +x run.sh down.sh

8. 推荐插件

插件功能
UpdraftPlus备份与恢复网站
文派头像解决 Gravatar 头像加载问题

参考资料

  1. 通过 Docker 部署 WordPress 搭建博客保姆级教程 - 博客园
  2. 如何配置 Redis 缓存以加速 WordPress - CSDN
  3. Docker 部署 Redis 并挂载配置/日志 - CSDN
  4. WordPress 更换域名完全指南 - CSDN

部署完成后访问 http://<你的服务器IP> 即可开始 WordPress 安装向导。

如需启用 HTTPS,请先配置好 SSL 证书并取消 Nginx 中的 rewrite 注释。


💡 提示:生产环境中请务必:

  • 修改所有默认密码
  • 关闭 MariaDB 的 3306 端口对外暴露(除非必要)
  • 使用 .env 文件管理敏感配置
  • 定期备份 wordpress-db-data 卷和 `./data/wordpress/html
Halo 博客搭建日记 (Docker, Nginx反代) 2026-01-08

评论区