13 10 月 2026

换服务器是刚需:配置不够了、服务商不合适了、成本要优化。但迁移容易出问题:数据丢一半、网站打不开、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 -t

SSL 证书

方式一:复制证书文件(省去验证)

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.sql

3)修改 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      # SPF

2)迁移 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 注意事项

迁移不当会导致排名下降,注意:

  1. 保持 URL 结构不变——不要改文章链接格式
  2. 做好 301 重定向——如果 URL 必须变,旧地址要 301 跳到新地址
  3. 保留 robots.txt 和 sitemap
  4. SSL 证书不能断(HTTPS 中断会掉权重)
  5. 不要长时间停机
  6. 更新 Google Search Console / 百度站长平台的站点信息(如 IP 变化)
  7. 保持标题、描述、结构化数据不变

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.php

WordPress

# 文件 + 数据库
# 如果域名变了,需要替换数据库中的旧域名
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
  • 别忘了环境变量配置文件

十二、回滚方案

万一新环境出问题,要能快速切回:

  1. DNS 改回老 IP(因为 TTL 已降到 60,几分钟生效)
  2. 或老服务器保持运行,直接改解析即可
  3. 数据差异:切换期间产生的新数据(评论等)需要手动补回老服务器

所以老服务器一定要保留到确认无误之后再下线。


十三、常见问题

问题原因解决
新站样式全丢文件权限不对或路径变了chown -R www-data,检查 root 路径
数据库连接失败config.inc.php 里账号密码不对核对数据库配置
打开是 404Nginx 伪静态没配复制 try_files 配置
图片不显示上传目录没同步检查 wp-content/uploads 之类目录
后台登录不了域名变了导致 cookie 问题更新站点 URL 配置
502PHP-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 记录详解》
延伸阅读
  1. 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
  2. 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
  3. 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
  4. 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
  5. 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
  6. RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
  7. 短链接服务搭建:Shlink 自托管,链接数据自己掌握
  8. 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道
更多阅读
  1. 上一篇:静态网站部署与 CDN 加速:博客、文档站、官网的最佳方案
  2. 下一篇:服务器性能测试与压测方法:上线前先知道自己能扛多少
发表评论 3