利用阿里云OSS托管HTTPS静态网站并配置CDN

2020年9月之前,本站都是通过云服务器自建Nginx对外提供静态网页的。 但是在9月,服务器又到期了,续费太贵。 在买新迁移的过程中,忽然想试试OSS对象存储对静态网站的托管能力,最终还是迁移上来了。

OSS简介

阿里云OSS

海量、安全、低成本、高可靠的云存储服务,提供99.9999999999%(12个9)的数据持久性。 使用RESTful API 可以在互联网任何位置存储和访问,容量和处理能力弹性扩展,多种存储类型供选择全面优化存储成本。

以上是官方自吹。 更多自吹和信息,可以看官网首页官网文档

对象存储协议,其实都是基于亚马逊AWS的S3来的。 虽然一般提供的UI界面看上去和普通的文件系统没有区别,实际上却有本质的不同。 只要理解两个核心概念,就能大致理解对象存储的含义——Bucket(桶)和Object(对象)。

Bucket是一个网络资源,相当于一个文件夹、硬盘。 它有一个独一无二的内部域名,或至少是域名+前缀,一一对应一个URL,全网唯一。 它是一个存储资源,所以通常伴随一个云服务提供商Region(区域)的概念。 同一个Region中,桶名是独一无二的,否则无法对应一个全网唯一的URL; 不同Region中,可以有相同的桶。 默认情况下,不同Region之间的桶是不会同步内容的,因为有跨区域流量。 它最大的特点是,逻辑上存储空间无限。 实际上,各云服务都有各自的上限,但上限很大,一般无需在意。

Object是Bucket中的内容,也可以把Bucket看做Object的集合。 一个Object相当于一个文件。 但是由于Bucket中只有Object,所以与PC文件系统不同,没有文件夹这个概念。 我们看上去像文件夹一样的东西,其实只是URL的PATH的一部分而已。 基于Object,可以单独地做读写(上传与下载)、权限管控等操作。

一个Object的完整URL,大概是这样的:oss://bucket/path/to/object。 (这里的oss://是阿里云的协议,通用的应该是s3://。) 其中缺少了域名,这通常需要额外配置。 和一般的云服务类似,鉴权采用了AK/SK的方式,也需要额外配置。

Bucket作为一个网络资源,有三种权限配置:公共读写、公共读、私有。 公共读写是很少有人用的,谁愿意花自己的钱给别人存储资源? 公共读通常用于图床、提供静态文件场景,也可以像本文这样直接托管整个静态网站。 私有是最常见的,通常用作内部系统的一个存储组件,或直接与外部进行可控对接。 之前有介绍过《Python利用S3的Presigned URLs实现无鉴权上传与下载》,就是对单个对象进行限时授权访问。

OSS配置静态网站

OSS这类服务,通常有三种类型。 这里静态网站托管,使用标准类型。 如果不知道使用什么类型,通常都是使用标准类型。

标准类型 低频访问类型 归档类型
适用场景 通用场景,平均每文件每月访问大于1次 单文件月访问不到1次,但访问需实时 单文件月访问不到1次,且适应解冻过程
对象最小计量大小 按照对象实际大小计算 64KB,即小于64KB的文件,按64KB计费 64KB,即小于64KB的文件,按64KB计费
最少存储时间要求 30天 60天
数据访问特点 实时访问 实时访问 需先解冻后才能读取,解冻时间1分钟
图片处理 支持 支持 支持,但需要先解冻
数据取回费用 按实际获取的数据量收取,单位GB 按实际解冻的数据量收取,单位GB

在线配置OSS

在线配置,主要是对Bucket进行创建和配置。

创建Bucket时,除了【版本控制】不开通、【读写权限】选择【公共读】以外,其它都无关紧要,可按需选择。 创建完成后,在【对象存储】【基础设置】【静态页面】中,还需要手动调整以下配置。

然后到【对象存储】【传输管理】【域名管理】中【绑定域名】,即可使用CNAME方式走自购域名访问网站。 如果域名也是阿里云买的,还可以自动添加CNAME记录,非常方便。 如果还买了证书,那么点击【证书托管】,配置一下,即可使用https协议访问。

在线配置CDN

直接用桶对互联网提供服务,当然也是可以的。 域名和https配置上,也像模像样。 但是如果通过CDN进行全球加速,效果通常要好一些。

在【传输管理】【域名管理】中,点击【阿里云 CDN 加速】的【未配置】,可以创建CDN。 在创建页面上,基本上什么都不需要改,或者也可以按需微调。

创建完成后,在【CDN】【域名管理】【HTTPS配置】【HTTPS证书】中,把证书配置上。 如果是通过阿里云购买的证书,可以直接在线选择,比OSS那边更方便。 证书配置完成后,【HTTPS配置】下的其它选项基本上可以全开。

【CDN】其它配置,可按需调整。 唯一要注意的是有个坑,【回源配置】【阿里云OSS私有Bucket回源】是不能打开的。 这个功能的意思是,配置好了以后,可以支持私有Bucket,这样别人就只能通过CDN访问了。 否则,其实是可以通过OSS的外部域名直接访问的。 但是配置过程中,需要进行复杂的授权配置;并且,即使授权无误,如果把Bucket的权限调整为私有,还是会挂 ——这可能是一个Bug。 本站因此在2020年9月挂了半天,引以为戒。

线下配置

线下配置,其实就是配置开发环境的OSS客户端。 这里选择了OSS官方的命令行客户端ossutil。 可以参考《下载和安装_命令行工具ossutil_常用工具_对象存储 OSS-阿里云》进行安装,以下给出一种安装方式。

cd ~/bin
wget http://gosspublic.alicdn.com/ossutil/1.6.19/ossutil64
chmod +x ossutil64

执行ossutil64 config,按提示填写。 这样可以新增~/.ossutilconfig文件,也可手动修改,内容如下:

[Credentials]
language=CH
accessKeyID=LTAI4G5df1xxxxxxxxxxxxxx
accessKeySecret=4pJGEQuKJeUXBexxxxxxxxxxxxxxxx
endpoint=oss-cn-hangzhou.aliyuncs.com

其中,accessKeyIDaccessKeySecret,即所谓AK/SK。 这需要在RAM获取,属于云服务基本操作,略。

选择ossutil,而不是s3cmd,是因为ossutil对自家的OSS优化做得更好。 s3cmd虽然也能上传成功,但是细节上有一些问题。 最不能忍的是对svg类型的文件,上传后的默认类型是image/svg,作为图片引用会失败。 而ossutil默认设置svg类型为image/svg+xml,这才能正常使用。

上传OSS操作

本地配置完成后,上传是很简单的。

ossutil64 cp -urf public/ oss://BUCKET/

其中,publice/显然是hugo的默认输出目录,可替换成任何静态网站输出目录。 BUCKET则需要修改为目标桶名。

结论

使用这种方式托管静态网站,简化了传统方式的操作,也提供了生产级的性能、安全、可靠性保障。 但是在细节上,还是有很多小问题的,比如URL中出现+则会miss,CDN总感觉有些慢半拍等。

在配置前,最大的担忧就是费用问题。 配置后发现,这完全是杞人忧天。 目前用了一个多月,竟然费用为零! 好像OSS和CDN都是按量付费、每日结算,而本站的访问量很小,还不足以让孤出钱,真是令人亦喜亦忧。


相关笔记