为什么迁移会导致停机(以及如何避免)
大多数网站迁移之所以中断,并不是因为复制文件很困难——而是因为 DNS 传播。当你把域名指向新服务器的那一刻,部分访客在接下来的几分钟乃至几个小时里仍会继续访问旧服务器,这取决于你 DNS 记录的 TTL(Time To Live,存活时间)。如果在这段时间窗口内旧服务器已被清空,或者数据库被拆分在两个位置之间,你就会丢失请求、订单或表单提交。
实现近乎零停机迁移的诀窍其实原理很简单:让旧站点保持完全在线,在新主机上构建一个完整可用的副本,在切换 之前 证明它能正常工作,提前降低 TTL 以便切换迅速完成,然后才更改 DNS。本指南将针对典型的 PHP/MySQL 站点(WordPress、Laravel、自定义应用)讲解这一流程,并且同样适用于你自己掌控的服务器或 cPanel/虚拟主机账户。
如果你迁移是为了将数据保留在沙特阿拉伯境内以符合 PDPL/NCA 要求,Skyline Cloud 提供境内托管——不过下面的步骤是通用的。
第 1 步——先降低你的 DNS TTL(提前 24–48 小时)
这是最重要的一步,而且必须在其他任何操作 之前 完成。TTL 告诉解析器应缓存你的记录多长时间。如果你的 A 记录 TTL 为 14400(4 小时),那么一次切换最长可能需要 4 小时才能完全传播。
在你的 DNS 服务商处(或 托管 DNS),将 A、AAAA、CNAME 以及 www 记录的 TTL 设置为一个较低的值——300 秒(5 分钟) 是一个稳妥的选择:
Type Name Value TTL
A @ <OLD_SERVER_IP> 300
A www <OLD_SERVER_IP> 300
此时 不要 更改 IP——只更改 TTL。然后至少等待与 旧 TTL 相同的时长,让所有已缓存的副本过期。切换完成后,你可以将 TTL 重新调高到 3600 或更高。
第 2 步——准备新主机并复制文件
首先在新主机上创建你的账户或服务器。如果你使用 Skyline Cloud,请创建你的 VPS 或虚拟主机套餐,并记下新服务器的 IP。
对于你拥有 SSH 访问权限的服务器,rsync 是最快、最可靠的复制方式——它会保留权限、可断点续传,并且可以重复运行以仅同步变更:
rsync -avz --progress -e ssh /var/www/html/ user@NEW_SERVER_IP:/var/www/html/
-a保留权限、所有权、时间戳和符号链接-v详细输出,-z在传输过程中压缩- 源路径末尾的斜杠表示复制 内容,而不是文件夹本身
对于 cPanel 到 cPanel 的迁移,使用内置的 Backup → Full Account Backup(完整账户备份) 或主机方协助的迁移,通常比手动 rsync 更简单。包括 Skyline 在内的许多服务商都可以为你执行迁移。
第 3 步——迁移数据库
在旧服务器上导出数据库:
mysqldump -u DB_USER -p --single-transaction --quick DB_NAME > backup.sql
--single-transaction 可在不锁定在线站点的情况下,为 InnoDB 表提供一致的快照。将转储文件复制过去,并在新服务器上导入:
scp backup.sql user@NEW_SERVER_IP:~/
mysql -u DB_USER -p NEW_DB_NAME < backup.sql
然后用新的数据库凭据更新你应用的配置——WordPress 用 wp-config.php,Laravel 用 .env,或其他相应的配置文件。
第 4 步——在更改 DNS 之前测试新站点
这正是迁移得以近乎零停机的关键所在:在线站点仍运行在旧服务器上时,你已彻底验证了新服务器。通过编辑 hosts 文件,强制 仅你自己的机器 将域名解析到新 IP。
在 macOS/Linux 上,编辑 /etc/hosts;在 Windows 上,编辑 C:\Windows\System32\drivers\etc\hosts:
NEW_SERVER_IP example.com www.example.com
现在,你的浏览器会为 example.com 加载 新 服务器,而世界上其他人仍看到旧服务器。逐页点击浏览、登录、测试表单、结账和后台管理。修复任何出问题的地方。当一切正常后,移除该 hosts 条目。
| 检查项 | 需要确认的内容 |
|---|---|
| 页面加载 | 没有 500/数据库错误 |
| 登录正常 | 会话、Cookie、后台访问 |
| 表单/结账 | 提交内容能写入数据库 |
| SSL | 新主机上的证书有效 |
| 邮件 | 邮件仍能正常路由(见第 6 步) |
第 5 步——最终同步与 DNS 切换
短暂地将旧站点置于维护/只读模式,确保在最后一次同步期间没有新数据被写入。重新运行 rsync(它只复制变更)以及最后一次 mysqldump/导入,以捕获最后时刻的写入。然后更新 DNS:
Type Name Value TTL
A @ <NEW_SERVER_IP> 300
A www <NEW_SERVER_IP> 300
由于 TTL 为 300,大多数访客会在五分钟内完成切换。保持 旧服务器持续运行,直到流量完全转移——通常为 24–48 小时——这样任何仍持有缓存记录的访客都能被正确地提供服务。正是这段重叠期防止了请求丢失。
第 6 步——别忘了邮件、SSL 和验证
- 邮件(MX 记录): 如果你域名的邮件是单独托管的,在网站迁移期间请保持
MX记录不变。迁移邮箱是一个独立的流程——参见 企业邮箱托管 了解境内邮件配置方案。 - SSL: 在切换前于新主机上签发一份全新的证书(Let's Encrypt 或你面板的自动 SSL),这样在 DNS 切换的那一刻 HTTPS 即可生效。
- 验证传播情况: 从多个位置进行检查:
dig +short example.com
从几个不同的网络运行它,或使用全球 DNS 传播检查工具,直到所有人都解析到新 IP 为止。
第 7 步——切换之后
一旦流量完全转移,且旧服务器已闲置一两天:
- 将 TTL 重新调高到
3600或更高,以提升稳定性并减少 DNS 查询。 - 对旧服务器做最后一次备份,然后将其下线退役。
- 更新监控、cron 定时任务,以及应用或防火墙中任何硬编码的 IP。
- 在已上线的新服务器上重新测试表单和支付功能。
迁移清单
- [ ] TTL 已降至 300(提前 24–48 小时)
- [ ] 新主机已就绪,文件已通过
rsync复制 - [ ] 数据库已导出并导入,配置已更新
- [ ] 已通过 hosts 文件测试新站点
- [ ] 旧站点已设为只读,最终同步已完成
- [ ] DNS 已指向新 IP
- [ ] 旧服务器保持在线 24–48 小时
- [ ] 邮件/MX 和 SSL 已验证
- [ ] TTL 已调回,旧服务器已退役
只要操作谨慎,你的访客永远不会看到错误——只会感受到一个更快、位于境内的站点。
准备好迁移了吗? 创建你的 Skyline Cloud 账户,将网站托管在沙特阿拉伯境内,享受符合 PDPL/NCA 的数据驻留、透明的定价以及本地阿拉伯语支持。
Comments
0 total · 0 threads