迁移记录

腾讯云旧服务器到期,不停机迁移到新的服务器上。

2024-10-07

【腾讯云】2核2G云服务器新老同享 99元/年,续费同价,云服务器3年机/5年机限时抢购,低至 2.5折

服务器到期

2021 年“双11”期间购买的腾讯云轻量服务器,在 3 年后的今天即将到期了。在 2023 年已经开始储备下一个备用服务器,现在新服务器已经续费到很久之后才会到期。

由于新的活动提供的配置要比原始的服务器低,主要是系统盘容量更小,导致无法直接通过控制台镜像的方式将服务器进行迁移。而且新服务器安装的系统是 Ubuntu 22.04-Docker26,支持在腾讯云控制台对镜像进行处理,比较方便,所以服务器迁移方面计划采用手动的方式对原始的每个部件进行迁移。

网站数据迁移

首先,在 git 平台账户上将新服务器的 SSH 密钥设置为信任,把主网站和子地址的数据通过 git SSH 的方式克隆到新的服务器上。

然后,对于一些曾经需要 Python 动态部署的不重要的部分,就把一些请求 URL 静态化为一个文件,由后面的 nginx 直接进行静态部署,注意 nginx 配置中默认会使用 application/octet-stream 进行响应,对于需要使用 JSON 响应的部分只能手动更改对应的 JavaScript 代码解析文本为 JSON:

data = JSON.parse(data);

最后,需要预先对服务器防火墙进行调整,放行一些端口以启用新的服务器之间的连接关系。

服务迁移

然后,在新服务器上安装 nginx,

sudo apt install nginx

然后修改 nginx.conf 文件配置它,并修改 sites-enabled/default 具体网站的配置。配置完成后,先进行 nginx 检查:

sudo nginx -t

如果检查通过,即可在不重启 nginx 的情况下重载配置:

sudo nginx -s reload

一切就绪后,之后可以通过修改 DNS 解析服务(或者 CDN 源站信息)将域名切换到新的服务器上。

EdgeOne CDN 配置

由于腾讯云现在推荐下一代的 EdgeOne CDN,正值老的 CDN 包过期,就购买了一年的新 EdgeOne CDN 包。购买 EdgeOne CDN 后,就可以直接通过在 EdgeOne CDN 控制台中修改 DNS 记录为加速域名的方式将请求重定向到新 CDN 中去,请注意需要在 CDN 中设置 HTTPS 证书,而不要只更新服务器上的 HTTPS 证书。

目前 EdgeOne 的预热缓存功能并不是非常完善,比如并不能直接预热目录,只能预热 URL,则需要对部署产物遍历生成一个文件上传。

import os

output_file = "urls.txt"
open(output_file,"w").close()

def write_file_list(root_url, root_dir):
with open(output_file, "a") as f:
for root, dirs, files in os.walk(root_dir, topdown=True): # 自上而下递归
# 删除 . 开头的文件夹(比如 .git)
dirs[:] = [d for d in dirs if not d.startswith(".")]
for file in files:
full_path = root_url + os.path.relpath(os.path.join(root, file), root_dir)
if file.startswith("."): # 删除 . 开头的文件
continue
f.write(full_path + "\n")

write_file_list("https://logcreative.tech/", "logcreative.github.io")

鉴于全量更新列表较大(甚至由于服务器的性能会有一定比例刷新失败),可以考虑使用 git 增量生成差异文件列表。

import subprocess

output_file = "incrurls.txt"
open(output_file, "w").close()

def write_changed_files(root_url, git_dir):
subprocess.run(['git', 'fetch'], check=True, cwd=git_dir)
result = subprocess.run(['git', 'diff', '--name-only', '..origin'],
check=True, stdout=subprocess.PIPE, text=True, cwd=git_dir)
changed_files = result.stdout.strip().split('\n')
changed_urls = [root_url + f for f in changed_files]
with open(output_file, "a") as f:
for url in changed_urls:
f.write(url + "\n")

write_changed_files("https://logcreative.tech/", "logcreative.github.io")

后续还会考虑使用 SDK 进行自动化操作。

目前来看,虽然 EdgeOne 相比于老的 CDN 仍然会有很多功能不完备的部分,但据宣传会使用更多的安全功能,并且可以更方便地全球网络加速,看来 EdgeOne CDN 有望打破之前 logcreative.tech 只能作为国内站的格局。

总结

本次初步迁移大约耗时5个小时,中间可能会感受到速度上的降级但是不会有明显的中断服务情形,使用“双重备份”的方式顺利地将服务器数据迁移到新的服务器上。

由于服务器开销还是比较厉害的,所以在博客这一栏的每个页面顶端都加了腾讯云的广告,感兴趣的话可以点击进入了解一下对于个人而言相对划算的轻量服务器配置,非常感谢!