如何通过Docker集群在子目录中部署运行WordPress?
WordPress单节点到EC2自动扩展Docker集群迁移实战问答
本文面向DevOps从业者,默认读者已掌握Docker、NFS、SSH、多主机容器编排,以及反向代理通过子目录(如/blog)路由至后端WordPress组的配置方法。
1. 如何将WordPress从Linux服务器迁移至Docker集群环境?
- 备份源服务器数据
- 数据库:执行
mysqldump -u [用户名] -p [数据库名] > wordpress_backup.sql导出完整数据库 - 站点文件:用
rsync -avz /var/www/html/ [NFS服务器地址]:/nfs/wordpress/将WordPress根目录同步到集群共享存储(如NFS)
- 数据库:执行
- 部署集群数据库服务
- 在集群中启动MySQL/MariaDB服务(可使用Docker镜像),创建对应数据库和授权用户,执行
mysql -u [用户名] -p [数据库名] < wordpress_backup.sql导入备份数据
- 在集群中启动MySQL/MariaDB服务(可使用Docker镜像),创建对应数据库和授权用户,执行
- 配置并启动WordPress容器
- 使用官方WordPress镜像,启动时通过环境变量指定数据库连接信息:
docker run -d \ -e WORDPRESS_DB_HOST=[数据库地址]:3306 \ -e WORDPRESS_DB_USER=[用户名] \ -e WORDPRESS_DB_PASSWORD=[密码] \ -e WORDPRESS_DB_NAME=[数据库名] \ -v /nfs/wordpress/:/var/www/html \ wordpress:latest - 在EC2自动扩展组中配置该容器模板,确保节点启动时自动挂载NFS并拉起服务
- 使用官方WordPress镜像,启动时通过环境变量指定数据库连接信息:
- 验证迁移
- 访问集群入口地址,确认站点内容、后台功能正常
2. 如何配置标准WordPress Docker镜像,使其通过反向代理路由的子目录提供服务?
- 设置WordPress站点URL
- 启动容器时添加环境变量:
-e WORDPRESS_SITE_URL=https://[域名]/blog \ -e WORDPRESS_HOME=https://[域名]/blog - 或在
wp-config.php中添加:define('WP_HOME', 'https://[域名]/blog'); define('WP_SITEURL', 'https://[域名]/blog');
- 启动容器时添加环境变量:
- 适配反向代理头信息
- 在
wp-config.php中添加,确保WordPress识别反向代理的HTTPS和真实IP:define('FORCE_SSL_ADMIN', true); if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') { $_SERVER['HTTPS'] = 'on'; } define('WP_REMOTE_ADDR', $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR']);
- 在
- 反向代理配置示例(Nginx)
location /blog { proxy_pass http://[WordPress集群后端地址]; proxy_set_header Host $host; 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; } - 修复静态资源路径
- 若站点内静态资源路径错误,可通过WordPress后台「设置-媒体」更新文件存储路径,或直接修改数据库
wp_options表的upload_path字段
- 若站点内静态资源路径错误,可通过WordPress后台「设置-媒体」更新文件存储路径,或直接修改数据库
3. 服务已启动,可在开发集群登录wp-admin,但生产集群无法登录!
排查方向及解决方法:
- 会话存储问题:开发环境单节点用本地文件存储会话,生产集群多节点需共享会话
- 配置Redis存储会话:在
wp-config.php中添加define('WP_REDIS_HOST', '[Redis地址]'); define('WP_REDIS_PORT', 6379); define('SESSION_SAVE_HANDLER', 'redis'); - 或挂载共享存储(如NFS)到容器的会话目录,修改
SESSION_SAVE_PATH指向该目录
- 配置Redis存储会话:在
- SSL与反向代理头问题:生产环境启用HTTPS但WordPress未识别
- 确保
FORCE_SSL_ADMIN设为true,且反向代理正确传递X-Forwarded-Proto头
- 确保
- 权限与安全组限制:生产集群安全组未开放WordPress后端端口,或NFS文件权限不足
- 检查EC2安全组规则,允许反向代理组访问WordPress容器端口(如80)
- 设置NFS共享目录权限为
www-data:www-data,执行chown -R www-data:www-data /nfs/wordpress/
- Cookie路径问题:子目录下Cookie路径未适配
- 在
wp-config.php中添加:define('COOKIEPATH', '/blog/'); define('SITECOOKIEPATH', '/blog/');
- 在
4. 糟了!为何REST API出现故障?
常见原因及修复:
- 子目录路径不匹配:REST API默认路径
/wp-json/在子目录下应为/blog/wp-json/- 在
wp-config.php中添加:define('REST_API_ROOT', '/blog/wp-json/'); define('REST_API_URL', 'https://[域名]/blog/wp-json/');
- 在
- 反向代理未转发REST请求:检查反向代理配置,确保
/blog/wp-json/路径被正确转发- Nginx配置示例:
location /blog/wp-json { proxy_pass http://[WordPress集群后端地址]/wp-json; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
- Nginx配置示例:
- CORS跨域问题:生产环境前端与WordPress域名不同导致跨域
- 在
wp-config.php中添加CORS头配置:add_action('rest_api_init', function () { remove_filter('rest_pre_serve_request', 'rest_send_cors_headers'); add_filter('rest_pre_serve_request', function ($value) { header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS'); header('Access-Control-Allow-Headers: Content-Type, Authorization'); return $value; }); }, 15);
- 在
- 文件权限问题:WordPress无法读取REST API相关核心文件
- 确保NFS共享目录权限正确,
www-data用户拥有读取权限
- 确保NFS共享目录权限正确,
- SSL证书问题:生产环境HTTPS证书无效,导致REST API请求被拦截
- 验证SSL证书有效性,确保反向代理配置正确的证书文件
内容的提问来源于stack exchange,提问作者Jolly Roger
相关产品推荐
相关产品推荐

