前言
今天想给我这个博客加一张图片,但是把图片文件和博客的文章放在一起,内容管理比较麻烦,并且会增大 git 仓库的体积。因此我就想到了使用图床分流博客中的图片。
在网上搜索了一些图床服务,发现国内免费的图床服务要么访问慢(因为源服务器在海外),要么不稳定(存在关站/被墙或者转为付费的可能),而国外著名的图床 imgur 在国内也处于半墙的状态。于是就想到了使用云计算厂商提供的 OSS 对象存储服务,虽然收费但是对于我这种有计划长时间运营下去的博客而言,图床的可靠性是最重要的。我可不想因为图站挂掉导致我在未来的某一天要重新找到再上传这些图片。
在看了阿里云、腾讯云和华为云三家之后我选择了阿里云,因为阿里云有每月 5GB 存储和外网流量的的免费额度,请求费用也就每万次一毛钱,对于我这种刚开的小站而言,存储、流量和请求都不会很大(如果被攻击那就是另一回事了,还望您手下留情)。关于阿里云的定价详情可以查看阿里云的价格计算器。
然后我就按照这篇博文的步骤搭建了图床,途中遇到了原文没有提及的许多问题,所以在这里记录一下完整的步骤、我遇到的问题与解决方案。
主要操作流程
创建Bucket:开通 OSS 并创建 Bucket。创建 Bucket 时选择海外的地域(如果在别的地域没有服务器的话,建议使用香港),存储类型选择标准存储即可,读写权限一定要选择私有,其余的附加服务按需启用(有的得加钱)。创建完成后可以向 Bucket 中上传一张图片作为测试图。
配置访问权限:进入权限控制 -> Bucket 授权策略面板,添加授权,配置如下图。
IP 字段填写的是 CloudFlare 的节点 IP,列表如下(来自知乎专栏):
173.245.48.0/20,103.21.244.0/22,103.22.200.0/22,103.31.4.0/22, 141.101.64.0/18,108.162.192.0/18,190.93.240.0/20,188.114.96.0/20, 197.234.240.0/22,198.41.128.0/17,162.158.0.0/15,104.16.0.0/12, 172.64.0.0/13,131.0.72.0/22,103.21.244.0/22,103.22.200.0/22, 103.31.4.0/22,104.16.0.0/12,108.162.192.0/18,131.0.72.0/22, 141.101.64.0/18,162.158.0.0/15,172.64.0.0/13,173.245.48.0/20, 188.114.96.0/20,190.93.240.0/20,197.234.240.0/22,198.41.128.0/17
配置 CDN:在 CloudFlare 的 DNS 管理面板添加 CNAME 记录,目标设为 Bucket 的域名(可以在 Bucket 的概览界面找到),代理状态设为已代理,否则 CDN 不起作用。
绑定域名:在阿里云的 Bucket 配置 -> 域名管理界面绑定你刚设置的域名,这时阿里云需要验证域名的所有权,按照其所说的在 CloudFlare 的 DNS 管理处添加指定 TXT 记录即可。
创建并添加证书:在 CloudFlare 的配置面板的 SSL/TLS -> 源服务器处,选择创建证书。创建之后会告诉你源证书与私钥,这个界面暂时不要动。打开刚才在阿里云控制台绑定证书的界面,选择证书托管,并上传 SSL 证书,这时会打开SSL 证书的界面,选择上传证书,并将 CloudFlare 给出的源证书和密钥复制到上传证书的对应字段处(证书名字随便设),然后确定。这时切换回上传 SSL 证书,应该就能在证书名称处看到刚刚设置的证书名字了(看不到的话重开一下这个界面试试),选中,然后点下方的上传即可。
这时就已经可以通过你设置的域名访问刚才上传的测试图片了。假如测试图片filename.jpg
存储在 OSS 的folder
文件夹下,你设置的域名为image.example.org
,则访问路径为https://image.example.org/folder/filename.jpg
。
安全性配置
- 跨域设置:在阿里云 OSS 的数据安全 -> 跨域设置中创建跨域规则,来源设置为你的网站的地址。为了能让网站在本地测试时也能正常展示图片,建议同时添加
localhost:*
与127.0.0.1:*
。 - 防盗链设置:和跨域设置类似。不同之处在于 Referer 是包含请求协议的,所以类似于
example.org
或localhost:*
等不包括协议的配置是无效的,需要改为https://example.com
或*://localhost:*
;需要注意的是*.example.org
虽然是有效的,但是没有指定 https 协议,安全起见最好改为https://*.example.org
。
PicGo 配置
PicGo 是一款快速上传图片到图床,并自动复制图片URL到剪贴板的工具,你可以在 Github 的 release 页获取该程序。
权限设置:在阿里云的权限控制 -> Bucket 授权策略面板新增授权,配置如下:
如果当前没有RAM子帐号,请点击右上角头像 -> 访问控制,然后在左侧的身份管理 -> 用户处创建一个子帐号。创建完成后在子帐号的详情页创建 AccessKey,得到 AccessKey 的 KeyID 与KeySecret,保留备用。
上传配置:打开 PicGo 主界面,在图床设置 -> 阿里云 OSS 内填写对应的表单项。“KeyID” 与 “KeySecret” 即刚才获取的子帐号 AccessKey 的 KeyID 与 KeySecret,“设定 Bucket”为 Bucket 的名称,“存储区域”为 Bucket 所在区域(与 Bucket 域名内的值统一,例如
oss-cn-hongkong
),自定义域名填写你设置的域名,其余两项按需填写即可。配置完成后点击确定并设为默认图床。
注:如果你使用的桌面环境是 KDE Plasma,可能需要在 PicGo 设置内打开“使用内置剪贴板上传”一项,否则无法正常从剪贴板直接上传图片。我使用的 Linux 发行版是 KDE Neon,其它发行版/桌面环境/操作系统尚未测试。