在 Compute Engine 中创建 Cloud Storage 的镜像

Compute Engine 中的主机访问 Cloud Storage,是一个常见用法。比如我把博客的图片都放在 Cloud Storage 中,然后在博客中直接引用。于是我只能做了一个反向代理,从 //leonax.net/images/ 来访问那些图片。

实践中发现,Apache 的反向代理不太稳定,有时候等了超过一分钟还没有把图片下载完。其实我的那些图片,基本上是不变的,不论下载多少次,都是同样的图。那为何不做了一个本地的镜像呢?调查了一下,做镜像有两种方法:一是通过一个名为 S3FS 的工具。它原本是为 AWS 的 S3 制作的,可以在 EC2 的主机上创建一个磁盘,磁盘的内容即为 S3 中储存的文件。由于 Cloud Storage 提供了仿 S3 的 API,S3FS 也与 Compute Engine 兼容。二是使用 Cloud Storage 的原生 API,它提供了类似 Linux 中的 rsync 功能,可以把 Cloud Storage 的内容同步到本地。

我选了后一种,因为它是原生的,并且我也只需要单向同步。

Cloud Storage 提供了一个工具 gsutil,它有一个指令就是 rsync。使用如下命令可以把容器(bucket)“leonax”同步到本地的 /var/www/images/ 文件夹中。

其中 -m 表示多线程运行,提升效率;-d 表示删除本地多余的文件;-r 表示递归执行,复制全部的子文件夹。如果你想要不间断地同步,可以把上述命令添加到 crontab 中。

如果在同步的过程中需要权限问题,比如“403 Access Denied”,请确保 Cloud Storage 中的帐号设置正确。

首先,在创建 Compute Engine 主机的时候,需要在高级设置(Advanced Options)中开启 Service Account,并允许 Storage 访问,如下图:

然后使用如下命令找到那个 Service Account(形如 xxxxxxx@project.gserviceaccount.com):

最后允许这个 Service Account 访问 Cloud Storage 的现有文件:

以及后续上传的所有文件:

之后要做的事情,就是修改 Apache 的配置,把反向代理改成访问本地的文件即可。


发表评论

电子邮件地址不会被公开。 必填项已用*标注