利用阿里云OSS托管HTTPS静态网站并配置CDN
2020-10-24 23:35:26 +08 字数:2817 标签: Aliyun Hugo2020年9月之前,本站都是通过云服务器自建Nginx对外提供静态网页的。 但是在9月,服务器又到期了,续费太贵。 在买新迁移的过程中,忽然想试试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时,除了【版本控制】不开通、【读写权限】选择【公共读】以外,其它都无关紧要,可按需选择。 创建完成后,在【对象存储】【基础设置】【静态页面】中,还需要手动调整以下配置。
- 默认首页:
index.html
- 默认404页:
404.html
- 子目录首页:开通
- 文件404规则:Redirect
然后到【对象存储】【传输管理】【域名管理】中【绑定域名】,即可使用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
其中,accessKeyID
与accessKeySecret
,即所谓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都是按量付费、每日结算,而本站的访问量很小,还不足以让孤出钱,真是令人亦喜亦忧。