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 头像加载问题 |
参考资料
- 通过 Docker 部署 WordPress 搭建博客保姆级教程 - 博客园
- 如何配置 Redis 缓存以加速 WordPress - CSDN
- Docker 部署 Redis 并挂载配置/日志 - CSDN
- WordPress 更换域名完全指南 - CSDN
✅ 部署完成后访问 http://<你的服务器IP> 即可开始 WordPress 安装向导。
如需启用 HTTPS,请先配置好 SSL 证书并取消 Nginx 中的 rewrite 注释。
💡 提示:生产环境中请务必:
- 修改所有默认密码
- 关闭 MariaDB 的 3306 端口对外暴露(除非必要)
- 使用
.env文件管理敏感配置- 定期备份
wordpress-db-data卷和 `./data/wordpress/html