WordPress Docker 部署文档
本文最后更新于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 访问安装页面

  1. 打开浏览器
  2. 访问: https://域名
  3. 应显示WordPress安装界面

7.2 安装步骤

  1. 选择语言: 简体中文
  2. 数据库信息(已自动配置):
    • 数据库名: wordpress
    • 用户名: wpuser
    • 密码: [在6.1步骤中设置的密码]
    • 数据库主机: mysql:3306
    • 表前缀: wp_
  3. 站点信息:
    • 站点标题: 您的网站名称
    • 用户名: 管理员用户名
    • 密码: 管理员密码
    • 电子邮箱: 管理员邮箱
  4. 完成安装

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
  • 更新记录: 初始部署文档

文档结束

注意:本文档基于实际部署过程编写,所有命令均经过测试验证。部署前请确保已阅读并理解所有步骤,特别是安全配置部分。

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
下一篇