记录一次完整的 WordPress 站点搬迁:把运行在阿里云(宝塔面板 / PHP 8.0 / MySQL 5.7.44)上的 yw116.top,整体搬到本地 PVE 的 Debian 12 + 宝塔 9,并通过软路由上的 Cloudflare Tunnel 恢复公网访问。全程没有用一键迁移插件,走的是最朴素也最可控的备份-传输-恢复路线。
搬迁思路
阿里云上把站点文件和数据库全量打包,管道直传本地;然后建库、建站、导入 SQL、配置 nginx,最后靠已有的 cloudflared 隧道把公网流量送回内网 168 端口,前台即恢复访问。
踩过的几个坑
1. 宝塔一键迁移插件连不上目标面板
两个原因叠加:一是接收面板地址不能带安全入口(/xxxx),插件会把接口路径直接拼在地址后面,带了入口必然 404;二是 API 密钥大小写敏感,屏幕上 F 和 l 极易看混,复制过去就是错的。实测从阿里云用纯地址 + 正确密钥调用,立刻返回 200。
2. WordPress 后台死活登录不上
原来原站的管理员密码早就不是常用密码了,用 wp_set_password 重置(phpass 加密)才真正生效,MD5 直插不可靠。另外站点默认强制后台 HTTPS,而内网 168 端口没有加密,http 访问会被强制跳 https 死循环转圈,需要在 wp-config 里 define(‘FORCE_SSL_ADMIN’, false)。这个设置只影响内网 http 访问,公网请求带 https 标识,完全不受影响。
3. wp-config 里不能直接调 WP 函数
remove_action / add_filter 这些函数在 wp-config 阶段还没被加载,直接写在 wp-config 里整个站点会白屏(响应 200 但全是死机页)。正确做法是放到 wp-content/mu-plugins/ 下的必须插件里。
4. 公网访问时快时慢
Cloudflare Tunnel 走海外边缘节点,国内链路波动是常态,时快时慢甚至偶发超时。这不是配置问题,是隧道链路的物理限制。最后的解法是:前台走隧道公网访问,后台走内网登录,最舒服也最稳。
最终架构
公网:Cloudflare 边缘 → cloudflared 隧道(软路由)→ 内网 192.168.10.175:168;内网:192.168.10.175:168 直连。前台域名访问,后台内网登录,互不干扰。