Home Knowledge base Skyline Cloud 如何在近乎零停机的情况下将网站迁移到新主机 KNOWLEDGE BASE

如何在近乎零停机的情况下将网站迁移到新主机

大多数网站迁移之所以中断,并非因为复制文件困难,而是因为 DNS 传播。本指南介绍如何针对典型的 PHP/MySQL 站点(WordPress、Laravel、自定义应用)实现近乎零停机的迁移:让旧站点保持在线、在新主机上构建完整可用的副本、在切换前完成验证、提前降低 TTL,最后才更改 DNS。

如何在近乎零停机的情况下将网站迁移到新主机

为什么迁移会导致停机(以及如何避免)

大多数网站迁移之所以中断,并不是因为复制文件很困难——而是因为 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),将 AAAAACNAME 以及 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 步——切换之后

一旦流量完全转移,且旧服务器已闲置一两天:

  1. 将 TTL 重新调高到 3600 或更高,以提升稳定性并减少 DNS 查询。
  2. 对旧服务器做最后一次备份,然后将其下线退役。
  3. 更新监控、cron 定时任务,以及应用或防火墙中任何硬编码的 IP。
  4. 在已上线的新服务器上重新测试表单和支付功能。

迁移清单

  • [ ] TTL 已降至 300(提前 24–48 小时)
  • [ ] 新主机已就绪,文件已通过 rsync 复制
  • [ ] 数据库已导出并导入,配置已更新
  • [ ] 已通过 hosts 文件测试新站点
  • [ ] 旧站点已设为只读,最终同步已完成
  • [ ] DNS 已指向新 IP
  • [ ] 旧服务器保持在线 24–48 小时
  • [ ] 邮件/MX 和 SSL 已验证
  • [ ] TTL 已调回,旧服务器已退役

只要操作谨慎,你的访客永远不会看到错误——只会感受到一个更快、位于境内的站点。

准备好迁移了吗? 创建你的 Skyline Cloud 账户,将网站托管在沙特阿拉伯境内,享受符合 PDPL/NCA 的数据驻留、透明的定价以及本地阿拉伯语支持。

SKYLINE Engineering

@skyline

The engineering team at SKYLINE Industrial Solutions. We publish field-tested guides drawn from real KSA and GCC deployments.

See author profile
SKYLINE engineering services

Need this implemented for you?

Reading is free — building it right takes a team. SKYLINE engineers ship Skyline Cloud for Aramco vendors, banks, hospitals and government agencies across Saudi Arabia. Talk to us before you start.

Aramco Approved Contractor ISO 9001 · ISO 27001 SAMA CSF aligned NCA ECC ready 247+ KSA clients

Comments

0 total · 0 threads
Be the first to leave a comment.