前言
服务器迁移是很多站长最担心的操作之一——担心数据丢失、担心网站宕机时间过长、担心迁移后出现各种奇怪的问题。
但实际上,只要按照正确的流程操作,服务器迁移可以做到:
- 数据零损失:完整备份和验证确保没有任何数据丢失
- 宕机时间最短:合理安排DNS切换时机,宕机时间控制在10分钟以内
- 迁移后完全可用:提前测试确保所有功能正常
本文提供一套经过实战验证的迁移流程,覆盖从准备到完成的每一个细节步骤。
一、迁移前准备:先做这四件事
准备一:记录原服务器所有配置信息
迁移之前,把原服务器的关键配置记录下来:
# 查看Nginx版本和配置路径
nginx -v
nginx -t
# 查看PHP版本
php -v
# 查看MySQL版本
mysql --version
# 查看已安装的PHP扩展
php -m
# 查看当前开放的端口
ss -tlnp
# 查看系统环境变量(.env文件)
cat /www/wwwroot/你的域名/.env
将这些信息保存到本地文档,新服务器需要搭建完全相同的环境。
准备二:在新服务器上搭建好运行环境
迁移数据之前,先在新服务器(网宝香港服务器)上完成环境搭建:
- 安装宝塔面板(参考《宝塔面板安装与配置完整教程》)
- 安装与原服务器相同版本的Nginx、MySQL、PHP
- 安装原服务器上使用的PHP扩展
验证环境一致性:
# 在原服务器执行
php -m | sort > /tmp/php_extensions_old.txt
# 在新服务器执行
php -m | sort > /tmp/php_extensions_new.txt
# 对比两个文件的差异
diff php_extensions_old.txt php_extensions_new.txt
差异项在新服务器上逐一安装。
准备三:降低DNS的TTL值
迁移前24~48小时,将域名DNS的TTL值从默认的3600秒(1小时)降低到300秒(5分钟)甚至60秒。
TTL降低后,DNS切换生效时间从最长1小时压缩到5分钟,大幅缩短切换窗口期,减少用户访问到错误服务器的时间。
在域名注册商(如Cloudflare)修改TTL:
- 进入DNS管理 → 找到A记录 → 将TTL从"Auto(自动)"改为"1 Min(1分钟)"
准备四:选择最佳迁移时间
选择网站流量最低的时间段(通常是凌晨2~4点)进行迁移,即使出现意外,影响的用户数量最少。
二、数据库迁移:最关键的步骤
步骤一:导出原服务器数据库
方法一:使用宝塔面板导出(推荐)
在原服务器宝塔面板 → 数据库 → 找到对应数据库 → 导出 → 选择压缩格式(.sql.gz),下载到本地。
方法二:命令行导出
# 导出所有数据库
mysqldump -u root -p --all-databases > all_databases.sql
# 导出指定数据库(推荐,更精确)
mysqldump -u root -p 数据库名 > database_backup.sql
# 带压缩的导出(大数据库推荐)
mysqldump -u root -p 数据库名 | gzip > database_backup.sql.gz
导出完成后,必须验证备份文件:
# 验证sql文件是否完整(检查末尾是否有完成标记)
tail -5 database_backup.sql
# 应该看到类似:-- Dump completed on 2026-04-14 12:00:00
# 验证压缩文件是否可读
gzip -t database_backup.sql.gz && echo "文件完整" || echo "文件损坏"
步骤二:将数据库文件上传到新服务器
# 使用scp上传(从本地到新服务器)
scp -P 新服务器SSH端口 database_backup.sql root@新服务器IP:/tmp/
# 或使用rsync(支持断点续传,大文件推荐)
rsync -avz -e "ssh -p 新服务器SSH端口" database_backup.sql root@新服务器IP:/tmp/
步骤三:在新服务器上导入数据库
# 登录新服务器
ssh -p 端口 root@新服务器IP
# 创建新数据库和用户
mysql -u root -p << 'EOF'
CREATE DATABASE 数据库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER '数据库用户名'@'localhost' IDENTIFIED BY '数据库密码';
GRANT ALL PRIVILEGES ON 数据库名.* TO '数据库用户名'@'localhost';
FLUSH PRIVILEGES;
EOF
# 导入数据库
mysql -u root -p 数据库名 < /tmp/database_backup.sql
# 验证导入是否成功
mysql -u root -p -e "USE 数据库名; SHOW TABLES;" | wc -l
导入后表的数量应与原服务器一致。
三、网站文件迁移
方法一:直接服务器间传输(推荐)
如果新旧服务器可以互相SSH连接,最高效的方式是直接服务器间传输:
# 在新服务器上执行,从原服务器拉取文件
rsync -avz --progress \
-e "ssh -p 原服务器SSH端口" \
root@原服务器IP:/www/wwwroot/你的域名/ \
/www/wwwroot/你的域名/
rsync的优势:
- 支持增量同步(只传输变化的文件)
- 支持断点续传(网络中断后继续)
- 保留文件权限和时间戳
- 显示传输进度
方法二:打包后传输
如果文件量大,先打包再传输效率更高:
# 在原服务器上打包网站文件
cd /www/wwwroot/
tar -czf /tmp/website_backup.tar.gz 你的域名/
# 下载到本地,再上传到新服务器
# 或直接从原服务器传到新服务器
scp -P 新服务器端口 /tmp/website_backup.tar.gz root@新服务器IP:/tmp/
# 在新服务器上解压
cd /www/wwwroot/
tar -xzf /tmp/website_backup.tar.gz
迁移后设置正确的文件权限
# 设置网站文件的所有者为Web进程用户
chown -R www:www /www/wwwroot/你的域名/
# 设置目录权限为755
find /www/wwwroot/你的域名/ -type d -exec chmod 755 {} \;
# 设置文件权限为644
find /www/wwwroot/你的域名/ -type f -exec chmod 644 {} \;
# WordPress wp-content目录需要写权限
chmod -R 755 /www/wwwroot/你的域名/wp-content/
四、配置文件更新
迁移完成后,需要更新配置文件中指向原服务器的数据库连接信息。
WordPress站点
编辑 wp-config.php:
// 更新为新服务器的数据库信息
define('DB_NAME', '新数据库名');
define('DB_USER', '新数据库用户名');
define('DB_PASSWORD', '新数据库密码');
define('DB_HOST', 'localhost');
如果网站域名不变,wp-config.php中的其他配置通常无需修改。
其他程序(Laravel、CodeIgniter等)
更新 .env 文件中的数据库连接配置:
DB_HOST=localhost
DB_DATABASE=新数据库名
DB_USERNAME=新数据库用户名
DB_PASSWORD=新数据库密码
五、新服务器本地测试(DNS切换前)
在正式切换DNS之前,必须在不影响线上服务的前提下测试新服务器是否正常。
修改本地hosts文件(仅本机生效)
Mac/Linux:
sudo vi /etc/hosts
Windows: 编辑 C:\Windows\System32\drivers\etc\hosts
添加:
新服务器IP 你的域名.com
新服务器IP www.你的域名.com
保存后,在本机浏览器访问你的域名,实际访问的是新服务器,线上用户仍访问原服务器。
测试清单
- 网站首页正常加载
- 所有主要页面可以访问
- 用户登录/注册功能正常
- 购物车和下单流程完整测试
- 图片和文件正常显示
- 网站速度正常(使用GTmetrix检测)
- SSL证书已申请,HTTPS访问正常
- 管理后台可以正常登录和操作
- 数据库查询正常(检查商品数量、用户数量是否与原服务器一致)
所有测试通过后,才进行DNS切换。
六、DNS切换:最关键的10分钟
切换步骤
第一步:记录当前DNS解析记录
在进行任何修改前,截图保存原来的DNS配置,以便出现问题时快速回滚。
第二步:修改A记录指向新服务器
在域名注册商(Cloudflare/Namecheap/GoDaddy)控制台:
- 将
@(根域名)的A记录改为新服务器IP - 将
www的A记录改为新服务器IP
第三步:等待DNS生效
如果前面已将TTL改为60秒,5分钟内全球大多数地区的解析会更新。
使用以下工具监控DNS生效情况:
- dnschecker.org:从全球多个节点检查DNS是否已更新
nslookup 你的域名:在本地验证解析结果
第四步:监控新服务器状态
DNS切换后,立即观察新服务器的访问日志和资源使用情况:
# 实时查看访问日志
tail -f /www/wwwlogs/你的域名.log
# 监控服务器资源
htop
确认流量已切换到新服务器,且服务器运行正常。
七、迁移后处理
保留原服务器一段时间
DNS切换后,不要立即关闭原服务器。建议保留至少48小时:
&a