各家 CDN 标准和使用

排除部分国内云服务器特立独行的设置, 其实目前部分厂商 CDN 已经提供标准化的接口

S3(Simple Storage Service) 标准: 亚马逊 AWS 定义的对象存储标准协议/API 规范, 现已成为行业通用对象存储标准

一般如果要做下载内容分发的话, 建议询问所在云服务器厂商时候提供这部分 对象存储 业务, 将分发的文件上传来提供全球下载CDN加速

S3 标准当中有以下概念

  • Bucket(桶): 顶级存储对象单位(全局唯一命名), 相当于创建独立的根目录等待资源放置, 用于归类(images,files,apk类似归类)

  • Object(对象): 存储最小单元, 即上传的分发文件, 比如你提交的静态图片/文件/压缩包等

  • CORS(跨域设置): 标准跨域访问规则, 控制前端网页能否直接通过 CDN 域名拉取桶内资源, 如果是不符合的域名就不允许拉取资源

  • Lifecycle(生命周期): 基于对象上传时间触发自动操作, 可以给资源设置 过期清理/冷热切换/版本控制 来保证资源可控

得益于标准化 S3 接口, 切换不同厂商CDN/对象存储时, 仅需同步桶内文件即可复用全部资源目录结构、权限与规则从而实现无缝切换

S3 标准操作有以下通用接口

  • 桶操作(Bucket)

    • PUT /{自定义的 bucket 名称}: 创建对应资源桶, 用于放置指定归类的资源
    • GET /: 罗列账号下所有资源桶
    • GET /{自定义的 bucket 名称}: 获取对应资源桶内部所有对象, 可以用于遍历资源从而刷新资源
    • DELETE /{自定义的 bucket 名称}: 删除指定资源桶(谨慎操作), 删除资源桶会导致相关资源对象一起清空
  • 对象操作(Object):

    • PUT /{自定义的 bucket}/{自定义 object 名}: 在指定资源桶之中提交对应文件
    • GET /{自定义的 bucket}/{自定义 object 名}: 下载/获取 CDN 当中资源文件
    • HEAD /{自定义的 bucket}/{自定义 object 名}: 获取文件元信息(大小/MIME/ETag, CDN 缓存更新的时候需要对比这部分信息)
    • DELETE /{自定义的 bucket}/{自定义 object 名}: 删除资源桶对应资源
    • PUT /{自定义的 bucket}/{自定义 object 名}?acl: 设置访问权限(公共读/私有读,控制 CDN 是否免鉴权访问等)

其实类比起来 bucket 操作就是相当于系统中的根目录/分类文件夹, 而 object 就是对应文件夹里的实体文件, 需要将文件关联到指定目录之中

Cloudflare 对象存储

Cloudflare 的对象存储目前是个人开发者最友好的, 基本上申请个域名托管就可以

但是部分国内线路可能会产生 负优化, 特别晚上高峰期的时候资源访问可能很不稳定

一般来说需要在项目后台自行编写 HTTP 请求将用于资源提交上来, 这部分因为每种语言都不一样所以这里采用工具模拟提交文件

首先是必须在 Cloudflare R2 当中确定 S3 API/账号ID/令牌信息

CloudflareR2

API 令牌 需要点击 管理 跳转内部就可以在内部生成, 目前令牌有两种类型:

  • 帐户 API 令牌(推荐): 整个帐户相关的服务身份验证和存储桶访问创建 API 令牌

  • 用户 API 令牌: 为特定的用户帐户特定的服务身份验证和存储桶访问创建 API 令牌

云服务厂商是支持以 组织 来作为单位(组织下面涵盖不同的个人账号), 想做组织下细分才需要 用户API令牌 来分配

一般来说直接创建 帐户 API 令牌 令牌即可, 后台系统的开发人员只需要上面提到的 S3 URLAPI 令牌

Token

那么这里就可以用工具模拟 S3 指令操作

API 文档(检索 R2Bucket 相关即可): https://developers.cloudflare.com/api/

API

这部分没什么好说的, 然后对外访问目录其实只需要在指定 数据桶(Bucket) 当中设置域名解析即可

Domain

这部分其实没什么需要太过深入的说明, 看看对应 Cloudflare 的官方文档配置即可

需要注意: Cloudflare 个人版每月免费额度只有 10G 左右, 对于个人一般是足够用, 但对于企业日常使用则建议升级企业套餐

阿里云

如果面向全球, 比较推荐 阿里云香港 的节点服务而不是使用直接国内云服务

阿里云 oss-fs: https://www.alibabacloud.com/help/tc/oss/user-guide/ossfs-quick-start

阿里云的 oss-fs 实际上就是将本地硬盘映射到 oss 的操作, 将文件操作同步变成 bucket 操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 下载 oss-fs 
sudo wget https://gosspublic.alicdn.com/ossfs/ossfs2_2.0.7_linux_x86_64.deb

# 安装 oss-fs
sudo dpkg -i ossfs2_2.0.7_linux_x86_64.deb

# 查看具体程序信息
# 一般来说程序都是放置于 /usr/local/bin/ossfs2 目录下
ossfs2 --version

# 创建配置文件,用于填写关联的 S3 API 地址
sudo touch /etc/ossfs2.conf
# 填写内容如下
# --oss_endpoint=https://oss-cn-hangzhou-internal.aliyuncs.com
# --oss_bucket=bucketName
# --oss_access_key_id=AAAI************
# --oss_access_key_secret=AAA8x*************************
# 更多对应参数可以参阅文档

# 创建挂载的目录, 也就是绑定内部文件提交到 bucket 之中
sudo mkdir /tmp/ossfs2-bucket

# 挂载绑定到阿里云的 oss 之中
sudo ossfs2 mount /tmp/ossfs2-bucket/ -c /etc/ossfs2.conf

# 卸载阿里云 oss 的 bucket
sudo umount /tmp/ossfs2-bucket/

阿里云的 oss 操作更加符合现代开发节奏, 无论什么编程语言的 S3 API 都被抽象成简单 fs 操作

如果先提交 CDN 只需要让管理后台直接执行 fopen/fwrite 之类操作即可