用 GSLB 和 GCS 部署自己的 Serverless 博客
我们平时在选择博客的解决方案的时候,可能会考虑用一个自己云端的 VM 来作为自己博客的一个载体,在这台 VM 上安装自己要的 http 服务,比如 apache 或者 nginx,然后把自己的静态资源放在 VM 中 host 给世界各地的人。 但是这样有一个不好的地方,如果你完全不用这台 VM 呢?比如说,你只是要部署一个自己的博客,但是平时除了写博文并部署以外你不会去关心自己的那台 VM,这样的话,其实你完全没有必要用 VM 的解决方案,可以直接考虑 Storage 的解决方案。 所谓的 Storage 解决方案就是,将自己的静态网页资源放在 Storage Service 中,国内可以考虑 Google Storage,国内可以考虑阿里 OSS 等解决方案商,然后通过一个 Loader Balancer 来做自己的静态资源的路由。
接下来,我将介绍一种通过 Storage Service 和 Load Balancer 结合的解决方案,让我们不用考虑自己的 VM 资源,不用考虑维护自己的云主机。
原理
- Storage Service
- 它是用来接管用户的静态资源的一种服务,通常可以用来存储网站的静态资源,或者是一个 PaaS 解决方案商的单结点的配置、或者是其它资源的 Archive 等,在目前我们现在的需求下,我们要的是一个可以方便只读访问的资源的集合,明显这是一个比较好的不需要买服务器的一个方式。
- 另外,通常来说 Storage Service 都是按资源的大小来付费的,这也是一个比 VM 好的地方。
- 不过要注意,有一些 Storage Service 的解决方案,是按单个文件大小付费的,比如说如果文档大小小于 4KB 就按 4KB 付费,这样的话,可能会对我们考虑费用的时候会有影响。
- Load Balancer
- 由云服务解决方案提供商提供的一个用于路由和负载均衡的服务,对于大量的路由网关的情况下可以考虑在 DNS 上绑定多个 Load Balancer 来做在 DNS 上的负载均衡和区域拆分。
- 一般的云服务提供商会为 Load Balancer 提供一个外网 IP,在自己的 DNS 提供商上为自己的域名绑定上这个 IP 就可以实现通过这个 Load Balancer 的入口来访问自己的网站了。
- 如果说,我们要部署的不是一个静态博客,而是一个有后台的博客,我们也可以通过 Load Balancer 的路由配置,将比如
/api/**/*
这样的 URL 地址绑定到我们的后台上去, 这个后台可以是一个 VM,也可以是 FaaS 中的一个函数,也可以是自己维护的 Kubernetes 集群的一个 Ingress,等等。 - 通过简单的路由配置,我们可以避免自己维护 Kubernetes 或者类似的集群,也可以不用自己起一个 nginx 做路由和负载均衡了。
通过 Google Cloud 来实践
- 首先我们要在 Google Cloud 上开通 Storage Service,并为自己的博客的域名绑定一个 bucket,并且这个 bucket 的名字需要和自己的子域名相同(注意一点,只有子域名才能做 DNS CNAME record,也就是说只能把 Serverless 的服务入口绑定到自己的子域名中,如果要考虑要根域名绑定,需要考虑 Web Forwarding 或者类似的技术,不在本文展开讨论了)。
- 在创建 bucket 之前,我们需要先通过 https://search.google.com/search-console/welcome 这个网站来对自己的根域名进行自己的域名认证。
- 通过域名认证之后,在
Storage -> Browser
页面可以创建一个自己该网站的 bucket,其中名字是自己的博客的域名(子域名),数据模式按普通的来,权限选择默认的Fine-grained
。 - 创建完了 bucket 之后,在 bucket 的详情页中选择
Permissions
,添加一个用户是allUsers
权限是Storage Object Viewer
的记录,表示这些静态资源将可以被任何人看到。 - 如果你的网站有特别的 404 页面和主页,可以通过在 bucket 列表面中,选择行末的三个点,选择
Edit website configuration
,配置默认页面和 404 页面的文件路径。
- 绑定之后,可以通过
gsutil
或者hexo-deployer-gcs
来把自己的静态网站从目录public
复制到云端的 bucket 中。 - 接下来,在 Google Cloud 的控制台中,打开
Network Services -> Load Balancer
,创建自己的 Load Balancer,生成的静态 IP 可以通过VPC Network -> External IP addresses
来做绑定。 - 最后,把自己的网站 IP 绑定到自己的域名中,通过 DNS A record 绑定即可。