利用阿里云OSS搭建图床

记录一下利用阿里云 OSS 搭建图床的过程。

一、前言

在我们搭建个人博客时,常常会有在博客文章里插入图片的需求。图片又占空间,又费流量,很多时候图片过于清晰,在文章里其实是不需要那么高清的。所以,我们需要一个便宜的存储图片的地方,最好能对图片进行简单的后处理,比如说进行压缩、增加水印之类,如果还能节省流量那就最好了。

阿里云 OSS 能够免费提供 5GB 的存储空间,40GB 存储空间一年也就 10 块钱,可以说是绰绰有余。另外,阿里云 OSS 支持对图片进行处理,且有 10TB/月 的免费额度。每月外网流出流量 ≤5 GB 时,不收取外网流出流量费用,应该是相当够用了。

二、步骤

1. 创建存储桶

首先当然是要注册阿里云账号,并且在阿里云控制台开通 OSS 服务。这里就不多说了。

我们在此创建一个 OSS Bucket,用于存储图片。

选择一个地域,存储类型只需要标准存储即可,存储冗余也不需要,直接本地冗余存储即可。读写权限选择公共读,这样我们就能在博客里进行展示。我这边选择了私有读写权限,这样,我可以进一步进行控制。

创建成功后我们就可以通过外网地址拼上文件路径进行访问了。

2. 上传图片

上传图片有多种方式,当然我们可以通过网页端直接上传图片到存储桶,也可以使用阿里云 OSS 的官方客户端进行上传,不过多少有点不便。

这里推荐一个工具,PicGo,它是一个开源的图床工具,支持多种图床,包括阿里云 OSS。我们可以通过它来上传图片到 OSS。

可以根据 PicGo 的文档,申请阿里云的 Token 进行配置,即可实现方便快捷的上传图片。

3. 图片处理

在数据处理-图片处理中,可以新建自定义样式,然后访问时拼上响应参数即可。

这里我将图片全部转为 50%质量的 webp 格式,压缩效果非常拔群,且能保证图片有足够的清晰度。

三、进一步处理

如果你有同地域的 ECS 服务器,可以访问到内网的 bucket 域名,那样还能够进一步进行配置。

1. 自定义域名

首先可以在服务器上使用 Nginx 反代内网 bucket 域名,这样,内网流量是不进行收费的,可以统一走服务器的外网流量,还可以绑定自己的域名。

2. 读写权限控制

可以将 bucket 的读写权限设置为私有,在 Bucket 授权策略中进一步控制权限。在这里我仅允许我的服务器内网 ip 进行只读访问。

3. 默认处理样式

上面我们设置了一个自定义样式,但是访问的时候每次都需要拼上响应参数,这样很不方便。我们可以在 Nginx 配置中统一加上该参数。

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
server {
# ...

location = / {
return 403;
}

set $token "";

if ($is_args) {
set $token "&";
}

set $flag "";

if ($args !~ "x-oss-process=style") {
set $flag "1";
}

location / {
if ($flag) {
set $args "${args}${token}x-oss-process=style/default";
}
proxy_pass https://iszy-img.oss-cn-shanghai-internal.aliyuncs.com;
}
}

4. 统一流量出口

在上面的配置中,我们统一走服务器的外网流量。众所周知,服务器固定宽带是比较贵的,如果使用按流量付费,图片的流量也是要花一点钱的。

不过阿里云推出了一种共享流量包,可以抵扣服务器按流量付费的流量,如果知道自己服务器流量大概有多少,使用共享流量包是相当合算的。

如果不是走共享流量包,可以还是直接走 OSS 的外网接口,不必要这么折腾了。