宝塔面板如何快速无损迁移到新的服务器?宝塔迁移完整流程与踩坑记录
本文为个人运维实操笔记,记录把宝塔面板和站点从旧机器整体搬到新机器时踩过的坑,供有同样需求的朋友参考。
测试环境说明
- 旧服务器: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 在新面板重建站点
不要直接改配置文件硬搬,正确做法是:
- 宝塔后台 → 「网站」→ 「添加站点」,域名填和旧站一样的域名
- 数据库选「不创建」(因为要导入旧数据)
- 建好后,把旧站点的文件覆盖进去:
# 把解压出来的旧站点文件覆盖到新站点目录
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 版本装错、数据库字符集不一致、伪静态规则漏抄。
八、踩坑总结
- 备份先行:站点文件、数据库、证书、vhost 配置、crontab,五样一样都不能漏。
- PHP 和 MySQL 版本必须对齐,别图省事装低版本,兼容问题排查很费时间。
- 数据库字符集要一致,旧库 utf8mb4 新库也必须 utf8mb4,否则中文乱码。
rsync --delete用前反复确认路径,写错会删掉不该删的文件。- 伪静态和反向代理规则在 vhost 配置里,光搬站点文件不带这些。
- 数据库密码新旧设成一致,能省掉改一堆应用配置的麻烦。
- 切 DNS 前先用 hosts 验证,验证过再切,出问题也好回滚。
- 旧机器别急着关,观察 1-3 天确认稳定再处理。
- 证书文件权限要改回 600,复制过去默认权限不对会导致 Nginx 起不来。
- 迁移临时文件别急着删,稳定运行一周后再清理。
版权声明
本文为个人运维实操记录,仅供技术交流学习。文中命令请根据自己实际环境调整路径、IP、域名和密码后再执行,操作前务必备份数据。

浙公网安备 33010602011771号