换服务器是刚需:配置不够了、服务商不合适了、成本要优化。但迁移容易出问题:数据丢一半、网站打不开、SEO 掉权重、邮件收不到。
这篇给一套可回滚、可验证的迁移流程,适用于 WordPress / Typecho / 任意 PHP 站点和静态站。
迁移前务必打快照。财富云计算 的云服务器支持快照与镜像,可快速复制环境;目标机如果是内网服务,可选 NAT 型(无独立公网 IP,价格比带独立 IP 机型省一半以上)。
一、迁移的三种方式
| 方式 | 适用场景 | 停机时间 |
|---|---|---|
| 打包迁移(文件 + 数据库导出导入) | 跨平台、跨服务商、换系统 | 几分钟 |
| 镜像/快照迁移 | 同一服务商内 | 几分钟 |
| rsync 增量同步 | 数据量大、想最小化停机 | 几乎为零 |
通用性最好的是"打包迁移",下面重点讲它。
二、迁移前准备(重要)
1)清单
- [ ] 网站源码目录(如
/var/www/html) - [ ] 数据库(用户名、密码、库名)
- [ ] 配置文件(Nginx 站点配置、PHP 配置、SSL 证书)
- [ ] 定时任务(crontab)
- [ ] 域名解析记录(A、CNAME、MX、TXT)
- [ ] 特殊环境依赖(PHP 版本、扩展、Node、Python 版本)
- [ ] 上传目录、附件、用户文件
2)记录原环境
# 系统版本
cat /etc/os-release
# 软件版本
nginx -v
php -v
mysql --version
# PHP 扩展
php -m
# Nginx 站点配置
ls /etc/nginx/sites-enabled/
cat /etc/nginx/sites-available/你的站点
# 定时任务
crontab -l
# 监听端口
ss -tulnp
# 数据库信息
mysql -e "SHOW DATABASES;"3)备份(老服务器)
# 网站文件
tar -czf /root/www-backup.tar.gz /var/www/html
# 数据库
mysqldump -uroot -p --single-transaction --routines --triggers --all-databases > /root/all-db.sql
# Nginx 配置
tar -czf /root/nginx-conf.tar.gz /etc/nginx/
# SSL 证书
tar -czf /root/letsencrypt.tar.gz /etc/letsencrypt/
# crontab
crontab -l > /root/crontab.txt在老服务器和目标机都做快照,出问题能回滚。
4)降低 TTL(关键!)
提前 1~2 天把域名解析的 TTL 改成 60 秒,这样切换 IP 时生效快。
原:TTL 3600
改:TTL 60不改的话,切换后可能有用户还在访问老服务器长达几小时。
三、目标服务器搭建环境
按老服务器的版本装同样的软件:
apt update && apt upgrade -y
apt install nginx php-fpm php-mysql php-gd php-curl php-mbstring php-xml php-zip php-opcache mariadb-server -y版本要一致或更高,特别是 PHP 大版本(老站用 PHP 7.4 的程序在 PHP 8 上可能报错)。
php -m | diff - <(ssh 老服务器 "php -m") # 对比扩展创建数据库和用户:
CREATE DATABASE mydb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER 'myuser'@'localhost' IDENTIFIED BY '密码';
GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'localhost';
FLUSH PRIVILEGES;四、传输数据
方式一:打包传输(简单直接)
# 在目标机上拉取(推荐,避免老服务器暴露凭据)
scp -P 22 root@老服务器IP:/root/www-backup.tar.gz /root/
scp -P 22 root@老服务器IP:/root/all-db.sql /root/
# 或者用 rsync(可断点续传,大文件推荐)
rsync -avzP -e "ssh -p 22" root@老服务器IP:/root/www-backup.tar.gz /root/方式二:rsync 直接同步目录(推荐)
省去打包解压,且可增量:
rsync -avzP -e "ssh -p 22" root@老服务器IP:/var/www/html/ /var/www/html/常用参数:
| 参数 | 含义 |
|---|---|
-a | 归档模式,保留权限/时间/软链 |
-v | 显示过程 |
-z | 压缩传输 |
-P | 显示进度 + 支持断点续传 |
--delete | 删除目标端多余文件(保持完全一致) |
--exclude | 排除某些目录 |
排除缓存和日志:
rsync -avzP --exclude='cache/' --exclude='*.log' \
root@老:/var/www/html/ /var/www/html/方式三:数据库直接同步(省去导出导入)
mysqldump -uroot -p -h 老服务器IP --single-transaction mydb | mysql -uroot -p mydb需要老服务器 MySQL 允许远程连接(注意安全,迁移完记得关)。
五、还原数据
# 网站文件
tar -xzf /root/www-backup.tar.gz -C /
# 或已用 rsync 同步则跳过
# 权限
chown -R www-data:www-data /var/www/html
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;
# 数据库
mysql -uroot -p mydb < /root/all-db.sql
# 或全库
mysql -uroot -p < /root/all-db.sql验证数据库:
USE mydb;
SHOW TABLES;
SELECT COUNT(*) FROM 主表; # 对比老服务器的数据条数六、配置 Nginx 和 SSL
复制配置
scp root@老服务器IP:/etc/nginx/sites-available/mysite /etc/nginx/sites-available/
ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/
nginx -tSSL 证书
方式一:复制证书文件(省去验证)
rsync -avzP root@老:/etc/letsencrypt/ /etc/letsencrypt/方式二:重新申请(更干净)
certbot --nginx -d example.com -d www.example.com⚠️ 如果还没改 DNS 解析,新服务器无法完成 HTTP-01 验证。要么先复制证书,要么用 DNS-01 方式申请。
七、切换前的验证(不要改 DNS)
用本地 hosts 或 curl 指定 IP 测试,确认新服务器完全正常后再切 DNS。
方法:curl 指定解析
curl -I --resolve example.com:443:新服务器IP https://example.com
curl -I --resolve example.com:80:新服务器IP http://example.com方法:改本地 hosts
# Windows: C:\Windows\System32\drivers\etc\hosts
# Linux/macOS: /etc/hosts
新服务器IP example.com www.example.com改完后浏览器访问(记得清 DNS 缓存),全面测试:
- [ ] 首页能打开,样式正常
- [ ] 内页、文章页正常
- [ ] 图片、CSS、JS 加载正常
- [ ] 后台能登录
- [ ] 能发表/修改内容
- [ ] 搜索功能正常
- [ ] 上传功能正常
- [ ] HTTPS 证书有效
- [ ] HTTP 自动跳 HTTPS
- [ ] 表单/评论能提交
- [ ] 数据库连接正常
测试完记得把 hosts 改回来。
八、正式切换
1)老服务器设置维护页(可选)
不想有停机的话,可以在老服务器放个维护提示。
2)最后一次增量同步
如果有新数据(评论、订单),再同步一次:
# 增量同步文件
rsync -avzP --delete root@老:/var/www/html/ /var/www/html/
# 增量同步数据库
mysqldump -uroot -p --single-transaction mydb > /tmp/final.sql
scp /tmp/final.sql root@新:/tmp/
# 新服务器上
mysql -uroot -p mydb < /tmp/final.sql3)修改 DNS 解析
把 A 记录改成新服务器 IP。
4)验证生效
dig example.com +short
dig @8.8.8.8 example.com +short
dig @223.5.5.5 example.com +short用 https://www.whatsmydns.net 看全球生效情况。
5)观察
切换后 24 小时内持续观察:
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log确认流量已经切过来,且没有异常报错。
九、切换后的收尾
1)处理邮件(如有)
MX 记录指向老服务器的话要一起迁移:
# 确认邮件相关解析
dig example.com MX +short
dig example.com TXT +short # SPF2)迁移 crontab
crontab -l > crontab.txt
scp crontab.txt root@新:/root/
# 新服务器上
crontab /root/crontab.txt
crontab -l # 确认3)迁移其他服务
- Redis 数据(
redis-cli BGSAVE后复制 dump.rdb) - 定时任务脚本
- 监控配置
- 备份策略(新服务器要重新配)
4)老服务器保留多久
建议保留 7~14 天,确认新环境完全稳定后再释放。期间保持快照。
5)恢复 TTL
稳定运行几天后,把 TTL 改回 3600 或更大。
十、SEO 注意事项
迁移不当会导致排名下降,注意:
- 保持 URL 结构不变——不要改文章链接格式
- 做好 301 重定向——如果 URL 必须变,旧地址要 301 跳到新地址
- 保留 robots.txt 和 sitemap
- SSL 证书不能断(HTTPS 中断会掉权重)
- 不要长时间停机
- 更新 Google Search Console / 百度站长平台的站点信息(如 IP 变化)
- 保持标题、描述、结构化数据不变
301 重定向示例:
# 旧 URL → 新 URL
rewrite ^/old-path/(.*)$ https://example.com/new-path/$1 permanent;
# 整站域名迁移
server {
listen 80;
server_name old-domain.com;
return 301 https://new-domain.com$request_uri;
}十一、不同程序的迁移要点
Typecho
# 文件
rsync -avzP /var/www/blog/ root@新:/var/www/blog/
# 数据库(或 SQLite 数据文件)
mysqldump -uroot -p typecho > typecho.sql
# 修改 config.inc.php 里的数据库信息(如库名/账号变了)
nano /var/www/blog/config.inc.phpWordPress
# 文件 + 数据库
# 如果域名变了,需要替换数据库中的旧域名
mysql -uroot -p mydb -e "
UPDATE wp_options SET option_value='https://new.com' WHERE option_name IN ('siteurl','home');
UPDATE wp_posts SET post_content=REPLACE(post_content,'https://old.com','https://new.com');
UPDATE wp_postmeta SET meta_value=REPLACE(meta_value,'https://old.com','https://new.com');
"或用 wp-cli:
wp search-replace 'https://old.com' 'https://new.com' --all-tables静态站
最简单,直接 rsync 整个目录即可,没有数据库。
有 Node/Java 服务
- Node:复制代码 +
npm install+ 配 PM2/systemd - Java:复制 jar + 配 systemd
- 别忘了环境变量配置文件
十二、回滚方案
万一新环境出问题,要能快速切回:
- DNS 改回老 IP(因为 TTL 已降到 60,几分钟生效)
- 或老服务器保持运行,直接改解析即可
- 数据差异:切换期间产生的新数据(评论等)需要手动补回老服务器
所以老服务器一定要保留到确认无误之后再下线。
十三、常见问题
| 问题 | 原因 | 解决 |
|---|---|---|
| 新站样式全丢 | 文件权限不对或路径变了 | chown -R www-data,检查 root 路径 |
| 数据库连接失败 | config.inc.php 里账号密码不对 | 核对数据库配置 |
| 打开是 404 | Nginx 伪静态没配 | 复制 try_files 配置 |
| 图片不显示 | 上传目录没同步 | 检查 wp-content/uploads 之类目录 |
| 后台登录不了 | 域名变了导致 cookie 问题 | 更新站点 URL 配置 |
| 502 | PHP-FPM 没启动或版本不对 | 检查 systemctl status php-fpm |
| HTTPS 证书警告 | 证书没迁移或域名不匹配 | 重新签发或复制证书 |
| 部分用户还访问老站 | DNS 缓存 | 等 TTL 过期,确认 TTL 已降低 |
| 邮件收不到 | MX 记录没迁移 | 检查邮件相关解析 |
十四、迁移检查清单
迁移前:
- [ ] 完整备份(文件 + 数据库 + 配置)
- [ ] 两台机器都打快照
- [ ] TTL 降到 60(提前 1~2 天)
- [ ] 记录原环境版本和清单
迁移中:
- [ ] 新环境装好软件(版本一致)
- [ ] 传输并还原数据
- [ ] 配置 Nginx + SSL
- [ ] 用 hosts 或 curl --resolve 完整验证
- [ ] 最后增量同步
切换后:
- [ ] 改 DNS
- [ ] 验证解析生效
- [ ] 观察日志 24 小时
- [ ] 迁移 crontab 和其他服务
- [ ] 恢复 TTL
- [ ] 老服务器保留 7~14 天
迁移最怕数据丢失,快照是最好的保险。财富云计算 的云服务器支持快照与镜像,迁移前后各打一份,出问题几分钟就能回滚。目标环境如果是内网服务、测试站,可选 NAT 型(无独立公网 IP,价格比带独立 IP 机型省一半以上),成本更低。
相关阅读:
- 《服务器备份与快照策略》
- 《用云服务器搭建 Typecho 博客》
- 《Nginx 安装与配置入门》
- 《域名解析与 DNS 记录详解》
延伸阅读
- 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
- 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
- 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
- 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
- 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
- RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
- 短链接服务搭建:Shlink 自托管,链接数据自己掌握
- 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道

[...]wp search-replace '旧域名' '新域名' --skip-columns=guid整站搬家(文件+数据库)见网站迁移完整流程。TypechoTypecho 配置在文件里,不用改数据库:// config.inc.php 改数据库连接[...]
2026-10-15 回复
[...]0 3 * tar -czf /backup/site_$(date +\%F).tar.gz /var/www/html -C /backup 2>/dev/null; rclone copy /backup/site_$(date +\%F).tar.gz remote:sitebackup/详细方案见网站迁移完整流程和rsync 同步与定时备份实战。六、安全三件套(小站也要装)[...]
2026-10-18 回复
[...]netsh advfirewall firewall add rule name="GameRange" dir=in action=allow protocol=UDP localport=26901-26903完整的 Windows 环境准备(远程桌面连接、运行库安装、SteamCMD 用法、开机自启、8 个常见坑)见:《Windows 云服务器开服通用前置教程》→ htt[...]
2026-10-18 回复