自建图床服务并配置免费CDN全球加速 过程记录

个人有一些图片托管的需求,在很多场景下比如说在博客文章中插入图片,在社交网站上分享图片,抑或是个人开源项目中的图片等等,都需要在文档(特别是MarkDown)中嵌入一个URL直链来指向图片。对于一些免费的图床服务商,个人感觉并不是很信任。数据安全是一方面,另一方面如果服务商跑路了,那么很多原先我创建的链接都会失效。据我所知,这样的例子比比皆是。

网上还有一些教程将GitHub当成免费图床来用。这样做弊端也很明显,GitHub在国内的访问速度非常慢,图片加载很慢。另外,缺少很多图床该有的功能,比如说自动压缩,自动转换成Webp,自动重命名等等。这样做也是不太可行的。下面就是一个我将GitHub用作图床的例子。每次我还需要将图片移动到代码仓库里,然后commit,push,我个人感觉很麻烦。

Image

还有一段时间我试过把WordPress的Midea库当作图床来使用,但是我发现图片链接中带有wp-content/upload这样的路径。然后链接中还会出现图片的名称。我感觉并不是很雅观,而且在隐私的保护中有一种说不好的感觉。就像是别人一看这个URL链接,就能获知一些图片以外的信息。下面就是用WordPress的Media库当图床例子。可以看到,产生的直链不是很美观,而且还能暴露一些信息。

所以,我这边产生了自建图床服务的想法。这种图床最好能自动转换jpg、png格式的图片为webp。这样图片就能比较高质量、快速地在用户浏览器中加载出来。有关WebP的简要介绍如下:

WebP is a raster graphics file format developed by Google intended as a replacement for JPEGPNG, and GIF file formats. It supports both lossy and lossless compression,[8] as well as animation and alpha transparency.

Google announced the WebP format in September 2010, and released the first stable version of its supporting library in April 2018.

然后图床还要能够自动压缩图片,然后产生带有MD5或者SHA256的URL链接,能够不暴露我的图片原始信息。然后还能够配置CDN加速,毕竟对于图床来说CDN非常重要,载入速度很大程度上影响用户的终端体验。还有最好能够用PHP写成,因为这样我能够上传到我的网站托管服务商进行托管,不需要另外去单独为这个买VPS来部署。

搭建EasyImages2.0自建图床

经过查找,我发现一款叫做EasyImages2.0的图床项目比较符合我的上述需要。这款图床用PHP写成,理论上能够在我的服务商托管的规则容许下正常运行。而且不需要数据库,免去了额外的数据库的配置,节约时间。

话不多说,先进入项目仓库下载最新发布版本。

先解压检查目录,不出意外的话应该是这样。项目根路径下有index.php,这种结构就可以直接FTP上传到托管服务商FTP上。不需要额外的配置,应该就可以使用了。然后,我就将压缩包上传到托管服务商的FTP上,解压到网站根目录public_html下(有些托管服务商是根目录www目录)

上述步骤完成后,FTP目录应该是下面这样。这个时候我们记得提前去app目录下,将upload.php权限改为0755。

修改权限的操作详情如下。可以按照我这样来。

还需要注意,根据该项目的兼容性描述,PHP环境需要满足一定的要求。

最低PHP 5.6,推荐PHP≥7.0及以上版本,需要PHP支持fileinfo,iconv,zip,mbstring,openssl扩展,如果缺失会导致无法上传/删除图片 文件上传视图提供文件列表管理和文件批量上传功能,允许拖拽(需要HTML5支持)来添加上传文件,支持上传大图片,优先使用HTML5旧得浏览器自动使用Flash和Silverlight的方式兼容

请确保fileinfo,iconv,zip,mbstring,openssl这几个扩展已经安装妥当。找到下面这种界面,然后用浏览器搜索检查是否都安装了。

然后,配置好网站的域名DNS解析后。我们应该就能看到站点了。根据软件的提示检查环境,设置用户名和密码后,就可以使用了。非常简单。我们接下来要进行一些设置,确保自建图床站点的安全,然后我们需要开启一些功能。

进入设置界面后,网站域名和图片域名可以配置相同的。如果你需要开启CDN加速,就配置不同的域名。图片域名配置为你预想的CDN域名。其他配置项如网站标题、网站关键字等待随意。

对外展示设置最好配置成这样,安全起见,最好不开启任何未登录用户的广场查看功能。其他默认即可。

然后上传设置中,可以配置URL的样式(已上传文件的命名样式)。我这边为了安全起见配置成UUID的样式,最大可能避免碰撞,然后用小写来保证URL的兼容性。我这边也配置了将图片统一转换成WEBP的格式,格式上规范一些,并且能够在WEB上最优化传输。其他配置可以不改。

在API设置中自己建立一个新的TOKEN用,然后删掉初始的两个。如果有Bot访问需求,用这个API很方便。

图床安全设置方面记得关掉开放数据并开启登录上传和验证码,最大程度保证自建图床的安全和隐私。

其他设置可以根据自己的需要来。然后哪里不懂的,可以查阅项目文档来指导自己的设置。另外还有一些关于HTTP服务器的安全配置,需要特别注意。

搭建AWS CloudFront CDN全球加速(永久免费)

自建图床准备妥当后,就可以开始着手搭建CDN加速了。目前AWS Cloudfront属于永久免费套餐(免费套餐一年过期后也可以继续用),然后每个月有1TB的免费上载额度还有数量HTTP/HTTPS访问访问额度。我这一年使用下来发现国内外访问都很快,没有什么问题。另外,AWS Cloudfront配置很灵活,还能提供免费的SSL证书。这些对于个人用途来说,绰绰有余。所以我选择了AWS的服务,没有再去考虑Cloudflare。不得不说一下,AWS的付费服务真的是很贵!!!

然而首先你需要一个AWS的账号,并且能够享受免费套餐。这些教程网上一大把,可以去搜搜。我这里就不讲了。准备好AWS账号后,进入AWS控制台。点击创建分配(什么叫做分配,难道是Distribution的机翻)。

然后源这个配置下,源域填写你的自建图床所在的域名,比如image.xxxx.com。其他都是可选的,特别注意不要开源护盾,这个要额外收费的。

默认缓存行为这样配置,我们不缓存除了图片以外的其他资源。

然后选择不要开启安全防护。因为开启了下个月又是一笔账单费用。后面就是按照我截图上的来设置。备用域名可以选择你刚刚填写的在图床那边填写的预定的CDN域名,如果你希望用AWS提供的域名来作为你图床的CDN直链域名,省得麻烦,那么可以不写。如果你填写了备用域名,那么在下面的自定义SSL证书那一栏先点击请求证书,为域名生成一个SSL证书。生成步骤就按照界面提示来,这里就不多说了。SSL证书发下来后,点击刷新输入框旁边的按钮来加载刚刚生成的证书,选择即可。

最后的一些设置,IPv6可以打开,毕竟现在很多网络环境都支持IPv6了。其他随意。在一切都妥当后,就可以点击创建分配了。

创建好后,你就可以看到这样的界面。你可以看到“分配域名“,你可异质结把这个当成你的图片直链URL,也可以在你的DNS解析中加入一条CNAME记录指向这个域名(前提是刚才设置了备用域名)。

在行为栏目,我们选择创建行为。

然后路径模式填写/i/*,这样就可以CDN代理访问所有的图片。自动压缩选No,因为图床已经做过一层压缩了。而且图片也不确定是不是可压缩对象,这边策略还是保证CDN的行为可控,免去一些麻烦。其他的就按照我截图来配置即可。

然后,一切设置妥当后,就可以点击页面底部的”创建行为“按钮。最后,为了更好的体验,你可以创建另外两条路径模式。如下图所示,除了路径模式不一样以外,其他配置和我们刚刚建立的行为的配置都一样。

图床中配置CDN直链

这里再提示一下,图床”图片域名“配置中检查CDN直链是否正确配置。示意如下。

最后

上面的流程都走完,都检查正确后你就可以随意上传图片,并获取直链了。非常方便。然后如果还嫌麻烦,还可以建立一个Bot,调用API来完整这个过程。这里就不详细展开了。

获取直链后,可以直接粘贴到MarkDown文档中使用。