群晖是一款非常优秀的 NAS 产品,它可以提供文件存储、多媒体服务、远程访问等功能。一般来说,一台群晖的寿命 4-6 年,折合下来比服务器便宜一点点。因此,我决定做云时代的逆行者,将服务器上的一些服务迁移到群晖上。
注意:云服务器的优点有很多,包括:更加安 全、更加灵活、更加便宜等等,迁移需谨慎。
原环境分析
租用的服务器是阿里云产品,选择了宝塔面板进行管理。
网站使用了前后端分离的设计模式,前端基于 Vue 生成的静态页面,后端则基于 Java。后端允许上传一些文件,使用的是 3000 端口进行通信,文件传输则在 8000 端口,路径设置为/upload/。通过 Nginx 进行了反向代理,将/upload/路径的请求转发到 8080 端口,将其他请求(80 端口)转发到 3000 端口。因此,对于这个网站,通信主要通过 80 端口和 8080 端口进行。
如果你遇到了类似的问题,只需要梳理出我们最终通过宝塔面板的哪些端口访问就可以了。
迁移策略
服务器迁移
创建一个 Docker 容器(如果原本用的是宝塔面板,那就继续使用宝塔面板),并按照原来的部署文档在容器内部重新运行服务。
将相关的命令设置为开机自启动。
另外,重要的文件等资料需要单独挂载,并可以设置为只读模式,以防止数据丢失同时更加安全。
端口映射
Docker 的镜像可以通过端口映射的方式,将容器内的端口映射到宿主机(群晖)的端口上。
路由器可以将外网流量转发到宿主机(群晖)上,因此只需要在路由器上设置端口转发即可。
需要注意的是,群晖的部分端口可能已被群晖自身使用,可以通过群晖官网查询。外网的部分端口(如 80 端口)可能被运营商封掉,或者路由器自身需要使用。因此,我们需要选择一些不常用的端口,以避免出现服务异常。
因此有了以下的端口映射规则(你可以先停止容器再设置):
容器内端口(宝塔) | 宿主机端口(群晖) | 外网端口 |
---|---|---|
80 | 4080 | 4080 |
8080 | 8080 | 4880 |
域名解析
现在我们需要将域名解析到服务器上,由于 80 端口不能直接访问,并且小区和域名供应商都会要求备案,这就需要我们使用 Cloudflare 的 DNS 解析服务。Cloudflare 可以充当中间人,将流量转发到服务器上。
即无法通过 http://www.xxx.com 直接访问到服务器,只能通过域名+端口号如 http://www.xxx.com:8080 访问。
在 cloudflare 中添加域名,全程按照提示操作添加即可。
添加完成后,选择规则->回源(Origin Rules)。因为 Java 用到了两个端口,所以需要添加两个端口转发规则:
-
当满足条件时(访问域名且路径不以/upload/开头),将流量转发到服务器的 4080 端口。
-
当满足条件时(访问域名且路径以/upload/开头),将流量转发到服务器的 4880 端口。
结果
通过以上步骤,我们成功地将网站迁移到了新服务器上。用户访问网站时,流程如下:
- 通过 DNS 解析,找到 cloudflare 的服务器。
- cloudflare 根据规则,把 80 流量转发到路由器的 4080 上。
- 服务器接收到流量,把流量转发到群晖的 4080 端口。
- 群晖接收到流量,把流量转发到容器的 80 端口。
- 容器接收到流量,通过 Nginx 分配数据。
- Nginx 根据规则,把流量转发到容器内的 8080 端口。
- 数据按照原本的路径逐一返回至 cloudflare。
- cloudflare 把数据返回给访问者。
如法炮制可以继续迁移其他站点。
这种迁移方式不仅保证了原有服务的连续性,也确保了服务器不会被外网直接访问,从而提高了网络安全性。即使网站被黑,也不会影响到其他服务,只需重启这个容器即可恢复原状。
后话
这次的迁移过程体现了分层思想的重要性,这主要来自《白帽子讲 Web 安全》这本书。整个过程没有遇到什么问题,只需要对容器化和 Cloudflare 有一定的了解。我希望我的经验能给读者带来一些启示。