最近在进一步简化自己使用的 IT 环境的技术结构,把博客从 WordPress 逐步转到静态网站生成工具。我的选择是 Hugo,和 Jekyll 类似,用 markdown 写作,然后一条命令生成最终可以发布的静态 html 文件。

这些 html 文件,当然是可以开一个 VPS,起 Web 服务器,绑定域名,然后上传到发布目录这样处理,如果手头正好有可用的 VPS 这也是一种方案。但大可不必为此专门去购买一个 VPS,因为性能上未必用得上,配置、维护服务器虽然不难也需要些例行的人工,支持托管静态网站的 Amazon S3 存储服务可能是更好的选择。

价格

Amazon S3 的价格一如既往的不直观:数据存放费用、数据传输费用;按请求次数、按数据大小、按区域收费,越看越让人摸不着头脑。好在对于文件尺寸不大的静态网站,可以省去计算的麻烦。和 VPS 的分档定价相比,优势是它提供了更细的粒度,用多少付多少,像我这种没什么访问量的博客,每月的花费可以以美分计算。

注意各个之间的价格略有差异,但如果你使用 Amazon CloudFront 作为 CDN 分发 S3 的内容,可以忽略区域的访问速度,只考虑价格因素。

配置

Bucket 是 S3 的存储单元,进入 S3 主界面,点击 Create bucket 为要托管的网站创建 bucket。

1. Name and region

Bucket name 需要和托管网站的域名保持一致(注意 bucket 创建后无法改名)

Region 选择托管的区域

2. Set properties

无需设置,下一步。

3. Set permissions

Manage public permissions 选项设置为 Grant public read access to this bucket. ,有了公开读取权限别人才能读到你这个 bucket 里的内容。

4. Review

确认无误后点击 Create bucket 完成

5. Set static website hosting

在列表中点击刚刚创建的 bucket,然后打开 Properties 页,点击 Static website hosting

选择 Use this bucket to host a website 选项,设置 Index documentError document ,保存。

在这里你也能够看到这个 bucket 的 Endpoint 地址。

这里要吐槽一下,为什么创建 bucket 第二步 Set properties 的时候不能直接设置 Static website hosting 呢,很奇怪啊。

域名

未绑定域名时,可以直接使用 Endpoint 地址访问。

根据文档,绑定顶级域名需要使用 Amazon Route 53。绑定子域名只需要为子域名添加一条 CNAME 指向 Bucket 的 Endpoint 地址即可。

发布

S3 的 Web 界面就可以上传文件,但网站的内容一般是增量更新,所以用有同步功能的上传工具会更方便。付费的选择有 TransmitGoodSync,免费的有 Cyberduck

连接 S3 需要用到 AWS Access Key,细节可参考如何获取 AWS Access Key

要记得为上传的文件设置公开读取权限。这个比较麻烦,把 bucket 设为公开后还要针对文件级别进行设置,不知道是否我的使用姿势有误。

可以考虑把推送到 GitHub,然后使用 Travis CI 进行自动化发布。(话说回来,静态网站托管在 GitHub Pages 上也不是不可以,这是另一个话题了)

如果有需要,还可以使用 Amazon CloudFront CDN 加速你的网站