客至汲泉烹茶, 抚琴听者知音

使用lsky+百度云CDN搭建自己的图床

前言

hostdare快过期了,决定放弃这个服务器,迁到阿里香港去。其他两个网站迁移很容易,博客迁移我已经做过好多次了,还总结出了一篇教程工具站更简单,本身就是一个静态站,打包带走就行。唯有图床是个问题,当初用的是Auxpi程序,功能强大,但安装起来很麻烦,迁移起来更是让人无从下手。

尝试了几次,决定放弃了,干脆新建个图床吧,反正原来的图床也没放什么东西(而且大部分是上传到公共图床上的)。那么问题来了,这次我要选什么图床程序?

大致想了想,它至少要满足以下条件:

  • 安装简单,我可不想再花太长时间搞一个bug丛生的程序了
  • 颜值舒服
  • 可迁移,这次的图床我可能会放一些重要资料了,必须保证能容易地迁移。
  • 支持api,本地写完文章之后,配合前一段时间写的自动上传程序,再也不用手动一个个上传了。
  • 方便查看和管理图片

至于聚合公共图床接口,其实仔细思考一下是没有必要的,毕竟免费才是最贵的。当初多少人信誓旦旦认为微博图床稳的一匹,4月份的时候还不是说关就关?数据还是放到自己手上才安心。

基于这个标准,我在github上找了找,决定选用lsky程序,它有以下特性:

  • 支持第三方云储存,支持本地、阿里云 OSS、腾讯云 COS、七牛云、又拍云。
  • 支持多图上传、拖拽上传、上传预览、全屏预览、页面响应式布局。
  • 简洁的图片管理功能,支持鼠标右键、单选多选等操作。
  • 强大的图片预览功能,支持响应式。
  • 支持全局配置用户初始剩余储存空间、支持单个设置用户剩余储存空间。
  • 支持一键复制图片外链、二维码扫描链接。
  • 支持设置上传文件、文件夹路径命名规则。
  • 支持图片鉴黄功能。
  • 支持文件夹分类功能。
  • 对外开放的上传接口。

最关键的是安装简单!基本就和typecho一样简单,就决定是你了!

安装lsky

github地址

依赖

  • PHP 版本 ≥ 5.6(建议使用PHP7+)
  • mysql 版本 ≥ 5.5
  • mysqli 支持
  • fileinfo 拓展
  • curl 拓展
  • rewrite

用宝塔,很容易就能搭建好一个LNMP环境,然后去软件商店,点开php设置,转向安装扩展,安装fileinfo扩展即可。

curl我服务器上好像是自带的,如果安装过程中提示缺少curl,可以参考以下方法安装开启:

yum -y install curl # centos
apt install curl # ubuntu/debian

然后进入php设置中找到配置文件,把curl前面的注释去掉

[scode type="red"]博主没有遇到curl缺失的问题,所以上述方法也没有测试,如果您发现该方法不可行,欢迎留言告诉我。[/scode]

安装

  1. 下载lsky最新版,上传至 web 运行环境,解压。
  2. 设置运行目录为 public。

  1. 配置 Rewrite 规则:
  • Nginx:
location / {
    if (!-e $request_filename) {
        rewrite ^(.*)$ /index.php?s=$1 last; break;
    }
}

  • Apache:无需修改
  1. 访问首页,未安装自动跳转至安装页面,根据页面提示安装即可。
  2. 安装完成以后请设置 runtime 目录755权限,如果你使用本地存储,public 目录也需要设置为755权限

更新

  1. 下载最新版程序并解压到本地。
  2. 将旧版程序 config/db.php 文件复制到新版程序的 config 文件夹,如果你使用的是本地储存策略,文件是储存在本地的,请注意也要将你旧版本的图片资源移动到新程序对应的目录。
  3. 删除旧版本程序所有文件,上传最新版程序到站点根目录即可(这一步也可以直接覆盖,但会有残留文件,不选择覆盖的话建议先打包备份旧版本)。
  4. 使用管理员账号登录,访问任意页面会跳转到升级数据库结构页面,根据提示操作即可。

FAQ:如果覆盖更新文件后无法重定向到更新页面,或首页出现错误,请直接访问 http://域名/install/update.html 进行更新。

迁移

和更新类似。但是多了几步:

  1. 备份你的数据库,并导入到新服务器中的数据库。
  2. 修改旧版程序config/db.php,将数据库相关配置改成新数据库的配置。
  3. 按照更新流程走一遍

完美!

接入CDN

为什么

虽然说数据要放到自己手里才安心,但是放到自己小水管上访问速度慢,放到阿里OSS,腾讯COS,七牛,又拍上又担心第二天起来的时候破产了。这样一来,CDN就成了成本较低的一种选择。我们可以以阿里OSS与阿里CDN的价格做一个对比。

这是OSS的价格:

相比之下,CDN的流量包是18元/100g/1年,1.2T就是216元,而对应的100g/月的OSS是441元,贵了一倍,这还不算存储费用(虽然存储便宜)。正好我还有个阿里1M,平时也就做一些采集,可以用来放图床。

解释一下CDN,CDN 的全称是 Content Delivery Network,即内容分发网络。简单来说,它就是把源站的部分资源缓存到各个节点的服务器上,用户访问网站时,可以就近获取这些资源,不仅加快了用户的访问速度,还有效降低了网站被搞瘫痪的风险(真实ip被隐藏起来了)

另外忘了说了,接入国内CDN是必须要备案的,正好,我也有个已备案域名。

废话不多说,开搞!

准备

首先开一个CDN服务。这没什么好说的,去百度云找到CDN服务,然后开通即可。貌似需要实名,不过应该也挺快的。两种计价方式任选一种,不过按流量计费更适合我们这些做博客的,当然你也可以直接买流量包。

我为什么不用阿里云呢?因为阿里云现在没有带宽封顶这个设置了,只能靠监控来提醒异常流量,试想要是晚上睡觉的时候被攻击了……百度云不仅有带宽封顶,还有有一欠费就停止服务的规定,损失还是可控的。阿里只有欠费二十四小时之后才停止服务……不敢想象24小时能打多少流量。为什么不用腾讯云呢?因为我还想留着我新用户的身份,再过几年参加活动呢……

然后就是准备两个子域名(当然你要用主域名也是一样的),我这里是pb.yanshu.workst.yanshu.workpb是图床网站(我们称为源站域名),st就是加速网址啦(也就是放到CDN上的网址)。

添加域名

准备好之后,就在百度云控制台里添加新域名

然后输入信息。业务分类选图片小文件加速,加速域名就填st,源站域名就是图床网址pb,点下一步会跳到缓存配置,也可以直接选“完成”,后续再进行配置。我这里已经创建好就没法下一步了,所以在缓存配置里进行演示。

缓存时间的意思是过多少天CDN再从源站获取更改,我们上传的图片一般不会发生变化,所以时间可以设置得尽可能长一些。

配置好后,百度会给你一个CNAME域名,回到你的域名服务商,添加一个主机记录为st的CNAME记录,把CNAME域名填到记录值中,过一会就ok了。

添加CDN

登录图床,添加存储策略中本地的CDN加速域名

保存后,你会发现图床的链接都变成st.yanshu.work/*了。但是问题来了,这些链接打不开啊!

我也不知道是什么情况,摸索了一个下午,才找到了一个解决方案:

在宝塔中新建一个st.yanshu.work站点,修改CDN里的回源配置为pb.yanshu.work,这下终于能访问了!速度还很快,基本能跑满带宽。(第一次打开可能有些慢,等CDN缓存好就快了)

判断CDN生效的方法:ping一下加速域名,如果显示的ip地址不是你服务器的地址,就代表CDN启动了

回源地址为www.domain.com 回源Host为host.upyun.com。那么实际回源是请求到www.domain.com解析到的IP,对应的服务器上的站点是host.upyun.com 。——摘自网络

那么问题又来了,万一有一天图床受到攻击,CDN自动停止了,我想要它自动切换到源站,该怎么办呢?我试着手动停止了CDN,果不其然图片链接又不能访问了。

仔细想想,CDN停了之后,那么st.yanshu.work上就没有任何内容了,无论怎么都不可能返回源站的网址啊。301跳转呢?试了一下也不行。

于是我就开始看百度云CDN的文档,在带宽阈值设置这一节中,有段话引起了我的注意:

配置项说明:

  • 带宽封顶:默认带宽阈值为10Gbps。
  • 访问限速:当带宽超出指定阈值时,动态调整该域名涉及的所有节点流量,进行限速,将带宽控制在阈值范围内;适用于防止普通异常情况发生,不影响用户的服务。
  • 访问返回404:当带宽超出阈值时,将对访问请求返回404页面,域名本身运行状态不变;适用于抵抗超强 DDoS 攻击,保护用户的源站。
  • 访问回源:当带宽超出指定阈值时,将域名下所有访问切回源站,CDN转为关闭状态;适用于控制 CDN 费用,不影响用户的服务。

也就是说,理论上讲我这种想法应该是能实现的,CDN开着的时候就通过CDN访问,CDN关着的时候就直接访问源站……源站!对了,我可以直接将加速域名st.yanshu.work的站点直接设到源站上啊,这样关闭CDN的时候不就是直接访问源站了吗?

说干就干,我把st.yanshu.work的网站目录修改为pb.yanshu.work,并把运行目录改为public

试了一下,成功了!开CDN的时候速度飞快,关闭的时候,虽然慢了点,但也是能访问图片的。

设置防盗链

毕竟CDN的流量费用也是很贵的,如果被别人随意引用那可真是为他人做嫁衣了,所以有必要设置防盗链。

设置起来也很简单,在访问控制里就可以添加。

那么问题又又又来了,设置防盗链之后,其他网站测试的结果还是照样显示啊!我都快绝望了,CDN好麻烦啊。

不过我还是继续振奋起来找办法,搜了好久,偶然在网上看到这篇文章。文中提到用阿里云CDN之后也出现了防盗链不起作用的情况,后来发现是没有配置https的缘故。赶紧加个SSL试试。

不过百度云的https证书还挺难找的,首先你要点进管理我的证书

接着选申购SSL证书,然后在一众收费证书中,找到trustasia域名型DV单域名版,只有它是免费的……

然后进入证书列表,点击证书申请

只用填加速域名st.yanshu.work即可,其他什么信息都不用填。注意验证方式一定要选DNS验证!

然后按照提示在域名服务商里做相应解析,过一段时间(大概十分钟)就显示“申请成功”了。接下来你就可以重新返回CDN界面部署你的证书了。

强制跳转也勾选上,回源协议选https。

然后回到宝塔给pb.yanshu.work也加上https,开启强制启用https。再把图床的CDN地址改成https://st.yanshu.work

完美!

回过头看看其他网站的引用……艹怎么还是能显示。

哦对,链接忘记改成https了。但即使是这样,http能引用还是让我很不爽。

暂时也没办法了,看看以后能不能解决吧。

[scode type="yellow"]1027更新:我发现其实也是有办法的,就是把空Referer关掉,这样的话http也不能引用了。不过也就不能复制图片链接到浏览器中查看了[/scode]

后记

我当然不是钱多得没地方烧,等到百度云加速审核通过以后,我就换到免费的云加速上。

添加新评论