记一次服务器迁移
服务器又要过期了,上一次的机器也是3年前的双十一购入的。
新买的配置比之前的带宽和核心数低一点,不过日常跑跑小demo服务&博客也差不多够用。
今年双十一的活动也还行,159 买一年送3个月。(300块 30个月也还不错)
本文记录分享一下整个服务迁移的过程。(不一定是最佳实践 ❤️)
迁移前准备
盘点
- 管理面板
原服务器使用宝塔面板做管理,这块了解到有 1Panel 这个平替产品。
时间比较紧迫,我还是选择沿用宝塔,下次搞个测试机体验一下 1Panel 再看情况替换。
- 服务器软件
主要就常见的一些软件
- 数据库:MySQL,Redis,MongoDB
- 其它:Nginx,Node
这部分使用宝塔面板的软件管理一键安装配置即可。
- 要迁移的服务
- 纯静态:博客,demo
- 带后端服务:前端 + Node.js 后端 + 数据库
配置新机环境
- 新机子 Web 服务器我选择了 Nginx1.25 (提示支持 HTTP3)。
- 数据库就按推荐的默认安装。
- Node.js 选择了最新的 Node22。
上述软件的安装,只需要在宝塔上一键操作即可。
过程中只遇到 MongoDB 有问题,需要介入解决一下。
错误的原因,也是宝塔的安装脚本没有兼容腾讯云的这款机器,在论坛找到了解决办法。
https://www.bt.cn/bbs/thread-134959-1-1.html
安装完 Node.js 之后,顺便安装了 pm2 (用来管理 Node 进程),pnpm(安装依赖)。
npm i -g pnpm
npm i -g pm2
开始迁移
采用一个一个站点迁移的方式,逐步迁移到新服务器上。
暂停站点访问
① 将网站前端临时指向一个默认的提示页面,避免网站直接无响应,此时访问页面的用户也知道发生了什么。
创建临时页面地址:/www/wwwroot/migrate/index.html
内容如下:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>网站升级中...</title>
</head>
<body>
<h1>网站升级中...</h1>
<p>预计15分钟左右恢复正常,请耐心等待。</p>
</body>
</html>
修改网站 Nginx 目录配置为临时文件目录
此时访问效果如下:
② 停止站点关联的后端服务
防止有用户没刷新停留在原页面,请求接口产生新的数据。
我这里采用直接停止对应后端服务的方式。
pm2 stop serviceName
如果是反向代理的接口也可以关闭反向代理的配置。
备份数据库
宝塔提供了一键备份的功能。
备份完后,可以将其下载下来,后面在新服务器上进行导入。
创建新站点
这个就使用宝塔面板默认的创建功能即可。
迁移站点配置和数据
① 同步前端资源
使用宝塔内置的压缩工具,将需要的资源压缩打包下载。
上传解压到新站点对应的目录下。
② 同步 Nginx 配置
我这块主要就是是反向代理和 SPA 的配置
location / {
try_files $uri $uri/ /index.html;
}
③ SSL 证书
可以直接拷贝过来旧的证书。
宝塔上操作也比较方便,CV 一下就可以了。
④ 数据库
创建同名数据库,账号和密码与之前的保持一致。
然后将备份的数据一键导入,包含 MongoDB 和 MySQL。
⑤ 后端服务资源
都是 Node.js 项目,将除 node_modules 外的资源压缩下载,导入到新机器上。
使用 pm2 启动服务。
pm2 start npm --name serviceName -- run start
TIP
要注意的点就是,和之前启动的服务端口保持一致,这样反向代理配置也可以直接拷贝过来用。
⑥ 配置反向代理
新服务到这里就在新服务器上跑起来了。
检查一下后端服务的启动日志是否正常,就可以做最后一步的域名转发配置了。
修改域名指向
最后一步了,修改域名的 DNS 解析设置,将域名指向到新服务器的 IP 地址。
大概10分钟左右就生效。
这样一个站点的迁移就搞定了。
其它坑
.DS_Store 文件
之前有些文件是从 Mac 电脑压缩上传的,解压后会产生 .DS_Store
文件,迁移的过程中顺手移除了,存在外部可以访问到的风险。
搜了一段 Shell,一键删除,来源:https://www.cnblogs.com/xuyaowen/p/DS_store.html。
# 查询当前目录下所有.DS_Store 文件
find "." -name .DS_Store
# 删除当前目录下所有.DS_Store 文件
find "." -name .DS_Store | xargs rm
主要是腾讯云报告有安全问题说这个,顺手处理了。
图片跨域
发现看板娘的 图片加载不出来,一坨黑的!
再看有个跨域请求。
琢磨了一下,少 CV 了一段针对图片的跨域配置!
SDK 内部应该是用的 new Image() 加载图片,所以触发了跨域的限制。
升级 HTTP3
http3 基于 QUIC 协议,QUIC 又基于 UDP,所以 443 端口得先开放一下 UDP 协议。
然后再找个网站 https://http3.wcode.net/?q=https://sugarat.top 检测了一下。
就说支持了??? 我一看没生效啊!
然后就开始捣鼓了,看官方文档。
还没搞出来,正在折腾中!
最后
感觉 20 多个站点迁起来还挺费事的,下次迁感觉可以写个脚本自动化搞一搞,这次也算有经验了。