个人有一些图片托管的需求,在很多场景下比如说在博客文章中插入图片,在社交网站上分 享图片,抑或是个人开源项目中的图片等等,都需要在文档(特别是 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 JPEG, PNG, 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 文档中使用。