本文最后更新于34 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
文档信息
- 部署日期: 2025年12月3日
- 服务器IP:
- 域名:
- Docker Compose版本: 新版 (docker compose,无横杠)
- 环境状态: 全新清理后的服务器环境
一、环境准备
1.1 系统要求
- CentOS 7/8 或 Ubuntu 20.04+
- Docker 20.10+
- Docker Compose 2.0+
- 至少2GB内存
- 至少20GB磁盘空间
1.2 环境检查
bash
# 检查系统版本
cat /etc/os-release
# 检查Docker版本
docker --version
# 检查Docker Compose版本
docker compose version
# 检查端口占用
ss -tlnp | grep -E ":80|:443|:3306"
1.3 清理旧环境(如适用)
bash
# 停止并删除所有WordPress相关容器
docker compose -f docker-compose.yml down -v 2>/dev/null || true
# 删除WordPress相关容器
docker rm -f wordpress_nginx wordpress_app wordpress_mysql 2>/dev/null || true
# 删除WordPress相关数据卷
docker volume rm \
my_wordpress_site_db_data \
my_wordpress_site_mysql_data \
my_wordpress_site_wordpress_data \
my_wordpress_site_wp_data \
wordpress_data \
2>/dev/null || true
#删除WordPress相关网络
docker network rm \
my_wordpress_site_wordpress_network \
my_wordpress_site_wp_network \
2>/dev/null || true
#验证清理结果
docker ps -a | grep -i wordpress || echo "无WordPress容器"
docker volume ls | grep -i wordpress || echo "无WordPress数据卷"
docker network ls | grep -i wordpress || echo "无WordPress网络"
二、文件准备
2.1 SSL证书准备
确保SSL证书文件位于:
- 私钥文件:
/etc/nginx/ssl/域名/域名.key - 证书文件:
/etc/nginx/ssl/域名/域名.pem
验证证书文件:
bash
ls -la /etc/nginx/ssl/域名/
# 应包含: 域名.key 和 域名.pem 两个文件
2.2 创建项目目录
bash
#创建项目主目录
mkdir -p ~/wordpress-deploy
cd ~/wordpress-deploy
# 创建子目录
mkdir -p nginx mysql backup
2.3 复制SSL证书到项目目录
bash
#在项目目录内创建ssl目录
mkdir -p ssl
# 复制证书文件
cp /etc/nginx/ssl/域名/域名.key ssl/
cp /etc/nginx/ssl/域名/域名.pem ssl/
# 验证复制结果
ls -la ssl/
三、配置文件创建
3.1 创建MySQL自定义配置文件
bash
cat > mysql/custom.cnf << 'EOF'
[mysqld]
#字符集配置
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init-connect='SET NAMES utf8mb4'
skip-character-set-client-handshake
#兼容性配置
default_authentication_plugin=mysql_native_password
# 连接配置
max_connections=1000
connect_timeout=60
wait_timeout=600
interactive_timeout=600
# 性能配置
innodb_buffer_pool_size=256M
innodb_log_file_size=128M
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
EOF
3.2 创建docker-compose.yml
bash
cat > docker-compose.yml << 'EOF'
services:
mysql:
image: mysql:8.0
container_name: wp_mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: RootPass@2025
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: WpUser@2025
volumes:
- mysql_data:/var/lib/mysql
- ./mysql/custom.cnf:/etc/mysql/conf.d/custom.cnf
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --default-authentication-plugin=mysql_native_password
networks:
- wp_network
wordpress:
image: wordpress:6.3-php8.2-apache
container_name: wp_app
restart: unless-stopped
depends_on:
- mysql
environment:
WORDPRESS_DB_HOST: mysql:3306
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: WpUser@2025
WORDPRESS_DEBUG: 0
volumes:
- wp_content:/var/www/html/wp-content
- ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
networks:
- wp_network
nginx:
image: nginx:alpine
container_name: wp_nginx
restart: unless-stopped
depends_on:
- wordpress
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
- ./ssl/域名.pem:/etc/nginx/ssl/cert.pem
- ./ssl/域名.key:/etc/nginx/ssl/key.pem
networks:
- wp_network
volumes:
mysql_data:
wp_content:
networks:
wp_network:
EOF
3.3 创建PHP上传配置
bash
cat > uploads.ini << 'EOF'
file_uploads = On
upload_max_filesize = 100M
post_max_size = 100M
max_execution_time = 300
max_input_time = 300
memory_limit = 256M
EOF
3.4 创建Nginx配置文件
bash
cat > nginx/default.conf << 'EOF'
#HTTP重定向到HTTPS
server {
listen 80;
server_name 域名(带www.) 域名(不带www.);
return 301 https://$server_name$request_uri;
}
# HTTPS服务器
server {
listen 443 ssl;
server_name (带www.) 域名(不带www.);
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
# 安全头
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
# 代理设置
location / {
proxy_pass http://wp_app:80;
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 X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
# 超时设置
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}
EOF
四、部署执行
4.1 启动服务
bash
# 进入项目目录
cd ~/wordpress-deploy
# 启动所有服务
docker compose up -d
# 等待服务启动(约30秒)
sleep 30
4.2 验证部署状态
bash
#查看容器状态
docker compose ps
# 预期输出:
# NAME IMAGE STATUS PORTS
# wp_app wordpress:6.3-php8.2-apache Up X seconds 80/tcp
# wp_mysql mysql:8.0 Up X seconds (healthy) 3306/tcp, 33060/tcp
# wp_nginx nginx:alpine Up X seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp
4.3 检查服务日志
bash
# 查看MySQL日志(应显示正常启动)
docker logs wp_mysql --tail 10
# 查看WordPress日志(应显示正常启动,无字符集错误)
docker logs wp_app --tail 10
# 查看Nginx日志
docker logs wp_nginx --tail 10
五、连接性测试
5.1 内部连接测试
bash
# 测试MySQL字符集配置
docker exec wp_mysql mysql -u root -pRootPass@2025 -e "SHOW VARIABLES LIKE 'character_set_%';"
# 测试WordPress到MySQL连接
docker exec wp_app bash -c "php -r '\$conn = new mysqli(\"mysql\", \"wpuser\", \"WpUser@2025\", \"wordpress\", 3306); if (\$conn->connect_error) { echo \"失败: \" . \$conn->connect_error; } else { echo \"成功! 版本: \" . \$conn->server_version; }'"
# 测试Nginx到WordPress连接
docker exec wp_nginx curl -I http://wp_app:80
# 预期输出:HTTP/1.1 302 Found(重定向到安装页面)
5.2 外部访问测试
bash
# 测试HTTP重定向
curl -I http://域名
# 预期输出:HTTP/1.1 301 Moved Permanently(重定向到HTTPS)
# 测试HTTPS访问
curl -k -I https://域名
# 预期输出:HTTP/2 302(重定向到安装页面)
六、安全配置
6.1 修改数据库密码(必须执行)
bash
# 生成随机强密码
NEW_ROOT_PASS=$(openssl rand -base64 16)
NEW_WP_PASS=$(openssl rand -base64 16)
echo "新Root密码: $NEW_ROOT_PASS"
echo "新WP用户密码: $NEW_WP_PASS"
# 修改MySQL中的密码
docker exec wp_mysql mysql -u root -pRootPass@2025 -e "
ALTER USER 'root'@'%' IDENTIFIED BY '${NEW_ROOT_PASS}';
ALTER USER 'wpuser'@'%' IDENTIFIED BY '${NEW_WP_PASS}';
FLUSH PRIVILEGES;
"
# 更新docker-compose.yml中的密码
sed -i "s/RootPass@2025/${NEW_ROOT_PASS}/g" docker-compose.yml
sed -i "s/WpUser@2025/${NEW_WP_PASS}/g" docker-compose.yml
# 重启服务使新密码生效
docker compose up -d
6.2 防火墙配置(如需要)
bash
# 如果使用firewalld
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
# 如果使用iptables
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables-save > /etc/sysconfig/iptables
七、WordPress安装
7.1 访问安装页面
- 打开浏览器
- 访问:
https://域名 - 应显示WordPress安装界面
7.2 安装步骤
- 选择语言: 简体中文
- 数据库信息(已自动配置):
- 数据库名: wordpress
- 用户名: wpuser
- 密码: [在6.1步骤中设置的密码]
- 数据库主机: mysql:3306
- 表前缀: wp_
- 站点信息:
- 站点标题: 您的网站名称
- 用户名: 管理员用户名
- 密码: 管理员密码
- 电子邮箱: 管理员邮箱
- 完成安装
7.3 验证安装
bash
# 检查数据库表是否创建
docker exec wp_mysql mysql -u wpuser -p[您设置的密码] wordpress -e "SHOW TABLES;"
# 应显示 wp_options, wp_posts 等表
八、日常维护命令
8.1 服务管理
bash
# 启动服务
docker compose up -d
# 停止服务
docker compose down
# 重启服务
docker compose restart
# 查看服务状态
docker compose ps
# 查看服务日志
docker compose logs [服务名]
docker compose logs -f # 实时查看
8.2 数据备份
bash
# 备份数据库
docker exec wp_mysql mysqldump -u wpuser -p[密码] wordpress > wordpress_backup_$(date +%Y%m%d).sql
# 备份WordPress文件
docker run --rm --volumes-from wp_app -v $(pwd)/backup:/backup alpine tar czf /backup/wordpress_files_$(date +%Y%m%d).tar.gz /var/www/html
# 备份配置文件
tar czf config_backup_$(date +%Y%m%d).tar.gz docker-compose.yml nginx/ mysql/ ssl/ uploads.ini
8.3 数据恢复
bash
# 恢复数据库
docker exec -i wp_mysql mysql -u wpuser -p[密码] wordpress < wordpress_backup.sql
# 恢复WordPress文件
docker run --rm --volumes-from wp_app -v $(pwd)/backup:/backup alpine sh -c "cd / && tar xzf /backup/wordpress_files.tar.gz"
8.4 更新与维护
bash
# 更新Docker镜像
docker compose pull
docker compose up -d
# 清理无用镜像
docker image prune -af
# 清理无用卷
docker volume prune -f
# 查看系统资源使用
docker system df
九、故障排除
9.1 常见问题及解决方案
问题1: 502 Bad Gateway
bash
# 检查Nginx连接
docker exec wp_nginx curl -I http://wp_app:80
# 检查WordPress日志
docker logs wp_app --tail 20
# 重启服务
docker compose restart nginx wordpress
问题2: 数据库连接错误
bash
# 检查MySQL状态
docker logs wp_mysql --tail 20
# 测试MySQL连接
docker exec wp_mysql mysql -u root -p[密码] -e "SELECT 1;"
# 检查字符集配置
docker exec wp_mysql mysql -u root -p[密码] -e "SHOW VARIABLES LIKE 'character%';"
问题3: SSL证书错误
bash
# 检查证书文件权限
ls -la ssl/
# 测试证书有效性
openssl x509 -in ssl/xswlhhh.top.pem -text -noout
# 重启Nginx
docker compose restart nginx
问题4: 内存不足
bash
# 查看内存使用
docker stats --no-stream
# 清理缓存
sync; echo 3 > /proc/sys/vm/drop_caches
# 限制容器内存(在docker-compose.yml中添加)
# services:
# mysql:
# deploy:
# resources:
# limits:
# memory: 512M
9.2 诊断脚本
bash
cat > diagnose.sh << 'EOF'
# !/bin/bash
echo "=== WordPress部署诊断 ==="
echo ""
echo "1. 容器状态:"
docker compose ps
echo ""
echo "2. 端口检查:"
echo -n "80端口: "; ss -tln | grep ":80 " && echo "已占用" || echo "空闲"
echo -n "443端口: "; ss -tln | grep ":443 " && echo "已占用" || echo "空闲"
echo ""
echo "3. 服务连通性:"
echo -n "MySQL: "; docker exec wp_mysql mysql -u root -pRootPass@2025 -e "SELECT 1;" 2>/dev/null && echo "正常" || echo "异常"
echo -n "WordPress: "; curl -s -o /dev/null -w "%{http_code}" -k https://www.xswlhhh.top && echo "可达" || echo "不可达"
echo ""
echo "4. 磁盘空间:"
df -h / | tail -1
echo ""
echo "5. 内存使用:"
free -h | head -2
EOF
chmod +x diagnose.sh
十、目录结构说明
text
wordpress-deploy/
├── docker-compose.yml # 主配置文件
├── uploads.ini # PHP上传配置
├── nginx/
│ └── default.conf # Nginx配置
├── mysql/
│ └── custom.cnf # MySQL自定义配置
├── ssl/
│ ├── xswlhhh.top.key # SSL私钥
│ └── xswlhhh.top.pem # SSL证书
├── backup/ # 备份目录
└── diagnose.sh # 诊断脚本
附录
A. 默认配置信息
- 数据库主机: mysql:3306
- 数据库名: wordpress
- 数据库用户: wpuser
- 管理员访问: https://域名/wp-admin
- 项目目录: /root/wordpress-deploy
B. 端口说明
- 80: HTTP访问(自动重定向到HTTPS)
- 443: HTTPS访问
- 3306: MySQL内部端口(不对外暴露)
C. 数据卷位置
- MySQL数据: /var/lib/docker/volumes/wordpress-deploy_mysql_data
- WordPress内容: /var/lib/docker/volumes/wordpress-deploy_wp_content
D. 联系方式
- 部署时间: 2025-12-03
- 文档版本: 1.0
- 更新记录: 初始部署文档
文档结束
注意:本文档基于实际部署过程编写,所有命令均经过测试验证。部署前请确保已阅读并理解所有步骤,特别是安全配置部分。





