宝塔面板如何快速无损迁移到新的服务器?宝塔迁移完整流程与踩坑记录

本文为个人运维实操笔记,记录把宝塔面板和站点从旧机器整体搬到新机器时踩过的坑,供有同样需求的朋友参考。

测试环境说明

  • 旧服务器:1核2G / Debian 12 / 宝塔面板 8.0 正式版
  • 新服务器:LuckVM 香港 CN2 节点 / 2核2G / Debian 12
  • 站点环境:Nginx 1.24 + PHP 8.2 + MySQL 8.0,WordPress 主站 + 1 个静态站

迁移这事说难不难,但顺序错了很容易把新机器也搞挂。下面按我实际操作的顺序来写。


一、迁移前必须先想清楚的三件事

迁移不是「复制粘贴」,动手前先确认:

1. 这次是整体搬还是只搬站点

  • 整体搬:面板配置、环境、站点、数据库、定时任务、SSL 证书全要迁
  • 只搬站点:新机器先装好环境,再把站点数据和数据库导过去

整体搬省事但风险高,出问题排查面大;只搬站点点多但可控。建议:新机器环境干净的情况下,用「只搬站点 + 手动重建环境」,比整个面板打包迁移稳得多。

2. 新旧机器的系统版本和环境是否一致

PHP 版本、MySQL 版本不一致时,直接搬数据库文件或配置文件会出问题。先在两台机器上执行:

# 看系统版本
cat /etc/os-release

# 看宝塔装的软件版本
bt default

3. 什么时候迁

  • 选业务低峰期(凌晨)
  • 迁移期间先别做其他改动,避免状态不一致
  • 提前把 DNS 的 TTL 调小(比如 300 秒),切 IP 时生效快

二、迁移前的备份(新旧机器都别省)

2.1 旧机器:全量备份

宝塔后台 → 「网站」→ 选中站点 → 「备份」→ 备份到本地,或者用命令行:

# 备份所有站点数据(宝塔默认备份目录)
ls -lh /www/backup/site/

# 备份所有数据库
ls -lh /www/backup/database/

命令行手动备份更直观,以 WordPress 站点为例:

# 打包站点目录
cd /www/wwwroot
tar -zcvf /root/site_blog.tar.gz blog.example.com

# 导出数据库
mysqldump -uroot -p'你的数据库密码' --single-transaction --routines --triggers blog_db > /root/blog_db.sql

mysqldump 那几个参数的用处:

  • --single-transaction:InnoDB 表不加锁导出一致性快照,业务不停机
  • --routines --triggers:把存储过程、触发器一起导出,否则搬过去会缺
  • 数据库大(几百 MB 以上)时加 --quick 降低内存占用

2.2 备份 SSL 证书

证书丢了要重新签发,还可能有频率限制,务必先备份:

# 宝塔证书目录
ls -lh /www/server/panel/vhost/cert/
tar -zcvf /root/cert_backup.tar.gz /www/server/panel/vhost/cert/

2.3 记录旧机器的关键配置

# 导出计划任务(crontab)
crontab -l > /root/crontab_backup.txt

# 导出 Nginx 站点配置文件
tar -zcvf /root/vhost_backup.tar.gz /www/server/panel/vhost/nginx/

这一步特别容易被忽略:伪静态规则、反向代理配置、自定义 location 都在 vhost 配置文件里,光搬站点文件是不带这些的。


三、新机器准备

3.1 装同版本宝塔

版本尽量和旧机器一致:

# 官方安装脚本,按需选对应系统的
url=https://download.bt.cn/install/install_lts.sh;if [ -f /usr/bin/curl ];then curl -sSO $url;else wget -O install_lts.sh $url;fi;bash install_lts.sh

装完记下面板地址、账号密码和端口。

3.2 安装同样的软件环境

在面板「软件商店」里按旧机器的版本装:Nginx、MySQL、PHP(注意 PHP 版本和旧机器保持一致,否则扩展和代码兼容会出问题)。

版本一定要对齐,我踩过一次:旧机器 PHP 8.2,新机器图省事装了 PHP 8.0,WordPress 主题里的语法直接报错,又折腾着重装。

3.3 装好必要的 PHP 扩展

# 看旧机器装了哪些扩展,新机器照样装一遍
php -m

把 fileinfo、opcache、redis、imagick 这些常用的都装上,不然搬过去站点会报各种缺扩展的错。


四、开始迁移

4.1 传站点文件

用 scp 或 rsync 从旧机器传到新机器。推荐 rsync,支持断点续传、增量同步:

# 在新机器上拉取(假设旧机器 IP 是 1.2.3.4)
rsync -avz --progress -e 'ssh -p 22' root@1.2.3.4:/root/site_blog.tar.gz /root/

# 解压到站点目录
cd /www/wwwroot
tar -zxvf /root/site_blog.tar.gz

如果站点文件特别大(几 GB),用 screen 或 nohup 挂后台传,断开 SSH 也不会中断:

screen -S transfer
# 进入 screen 后执行 rsync,按 Ctrl+A 再按 D 退出会话,回来时 screen -r transfer

4.2 在新面板重建站点

不要直接改配置文件硬搬,正确做法是:

  1. 宝塔后台 → 「网站」→ 「添加站点」,域名填和旧站一样的域名
  2. 数据库选「不创建」(因为要导入旧数据)
  3. 建好后,把旧站点的文件覆盖进去:

# 把解压出来的旧站点文件覆盖到新站点目录
rsync -av --delete /www/wwwroot/解压出来的目录/ /www/wwwroot/blog.example.com/

--delete 表示让目标目录和源完全一致,能清掉新机器上自动生成的默认文件。执行前务必确认路径写对了,--delete 写错目录是会删东西的。

4.3 导数据库

# 在新机器上创建同名数据库(宝塔面板操作,或用命令)
mysql -uroot -p -e "CREATE DATABASE blog_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"

# 导入数据
mysql -uroot -p'新机器数据库密码' blog_db < /root/blog_db.sql

常见坑:字符集不一致导致中文乱码。 导入前先确认旧库的字符集:

# 旧机器上查
mysql -uroot -p -e "SHOW CREATE DATABASE blog_db\G"

旧库是 utf8mb4,新库也必须建 utf8mb4,别用默认的 latin1。

4.4 改站点配置里的数据库信息

WordPress 站点的 wp-config.php 里存的是旧机器的数据库账号密码:

vim /www/wwwroot/blog.example.com/wp-config.php

把 DB_NAME、DB_USER、DB_PASSWORD、DB_HOST 改成新机器的。如果新机器数据库密码和旧机器一样,这步可以跳过——这也是为什么我建议新机器数据库密码和旧机器设成一致的,能少改一堆配置。

4.5 还原伪静态和站点配置

从备份里把旧机器的 vhost 配置拿过来对照:

# 解压旧配置
tar -zxvf /root/vhost_backup.tar.gz -C /tmp/

# 对照看差异,把伪静态、代理规则手动贴到新面板对应位置的「配置文件」里
diff /tmp/www/server/panel/vhost/nginx/blog.example.com.conf /www/server/panel/vhost/nginx/blog.example.com.conf

伪静态建议直接在宝塔面板「网站」→ 「设置」→ 「伪静态」里选 WordPress 规则,比手抄配置文件不容易错。

4.6 还原 SSL 证书

宝塔「网站」→ 「SSL」→ 「其他证书」,把旧的证书内容贴进去。

# 如果证书文件还在,直接拷贝过去更省事
cp /tmp/www/server/panel/vhost/cert/blog.example.com/* /www/server/panel/vhost/cert/blog.example.com/

注意证书文件的权限:

chmod 600 /www/server/panel/vhost/cert/blog.example.com/privkey.pem
chown -R root:root /www/server/panel/vhost/cert/


五、切换与验证

5.1 先用 hosts 验证,别急着切 DNS

在本地电脑改 hosts,把域名指到新机器 IP,验证站点一切正常:

# 本地 hosts 文件加一行(Windows 是 C:\Windows\System32\drivers\etc\hosts)
新机器IP blog.example.com

验证清单:

  • [ ] 首页、内页能正常打开
  • [ ] 后台能登录
  • [ ] 图片正常显示(不是红叉)
  • [ ] HTTPS 锁标志正常,无混合内容警告
  • [ ] 伪静态生效(URL 不带 index.php)
  • [ ] 表单提交、评论功能正常

5.2 数据库连接测试

# 在新机器上确认数据库能连上、表数据在
mysql -uroot -p -e "USE blog_db; SHOW TABLES; SELECT COUNT(*) FROM wp_posts;"

5.3 切 DNS

验证没问题后再改 DNS 解析记录指向新 IP。因为提前调小了 TTL,一般几分钟到半小时生效。

切换后先别急着关旧机器,观察 1-3 天,确认所有流量都过来了、没问题,再处理旧机器。

5.4 检查计划任务

把旧机器的 crontab 还原到新机器:

# 新机器上导入
crontab /root/crontab_backup.txt
# 查看是否生效
crontab -l

宝塔面板里的计划任务要在面板里手动重建(命令行 crontab 和面板的任务不是一回事)。


六、迁移完成后必做的收尾

6.1 重新申请或续期证书

搬过去的证书可能快到期了,顺手在宝塔面板重新申请一次,让它自动续期:

# 测试自动续期脚本
/www/server/panel/pyenv/bin/python /www/server/panel/plugin/ssl/ssl_cron.py

6.2 检查磁盘和 inode

新机器容量和旧机器可能不一样,确认下:

df -h
df -i

6.3 清理迁移临时文件

# 删掉传过来的备份包,别占着磁盘
rm -f /root/site_blog.tar.gz /root/blog_db.sql /root/cert_backup.tar.gz /root/vhost_backup.tar.gz
rm -rf /tmp/www

别删太早,确认站点稳定运行一周后再清。


七、一次真实迁移复盘

以我最近一次迁 WordPress 站为例,时间线:

时间 动作 结果
00:10 旧机器打包站点 + 导出数据库 数据库 180M,站点 1.2G
00:25 新机器装宝塔 + 环境 PHP 版本一度装错,重装
01:00 rsync 传站点文件 用 screen 挂后台,约 8 分钟
01:15 新面板建站 + 导数据库 字符集报错,改 utf8mb4 后成功
01:40 改 wp-config + 还原伪静态 伪静态手抄漏了一条规则,页面 404
02:00 还原证书 + hosts 验证 图片红叉,是权限问题
02:20 本地 hosts 全流程验证通过 —
次日 10:00 切 DNS 半小时生效
3 天后 观察无异常,关旧机 完成

踩的三个坑:PHP 版本装错、数据库字符集不一致、伪静态规则漏抄。


八、踩坑总结

  1. 备份先行:站点文件、数据库、证书、vhost 配置、crontab,五样一样都不能漏。
  2. PHP 和 MySQL 版本必须对齐,别图省事装低版本,兼容问题排查很费时间。
  3. 数据库字符集要一致,旧库 utf8mb4 新库也必须 utf8mb4,否则中文乱码。
  4. rsync --delete 用前反复确认路径,写错会删掉不该删的文件。
  5. 伪静态和反向代理规则在 vhost 配置里,光搬站点文件不带这些。
  6. 数据库密码新旧设成一致,能省掉改一堆应用配置的麻烦。
  7. 切 DNS 前先用 hosts 验证,验证过再切,出问题也好回滚。
  8. 旧机器别急着关,观察 1-3 天确认稳定再处理。
  9. 证书文件权限要改回 600,复制过去默认权限不对会导致 Nginx 起不来。
  10. 迁移临时文件别急着删,稳定运行一周后再清理。

版权声明

本文为个人运维实操记录,仅供技术交流学习。文中命令请根据自己实际环境调整路径、IP、域名和密码后再执行,操作前务必备份数据。

posted @ 2026-11-03 23:41  前端已挂  阅读(2)  评论(0)    收藏  举报