长话短说, 因为受到有关XX的压力和初心不再的影响, 七牛在几天内就将正式停用之前大家用的无需备案的免费图床 ,转而强制备案或者直接关停 . 因为图片存储几乎影响所有markdown文档以及博客显示, 这里记录一下迁移的方案.
更新补充一下CDN加速的相关知识.
0x00. 思路
- 借一个临时的个人备案域名, 然后在域名管理上让别人开一个二级域名, 比如
img.xxx.com, 然后qiniu上绑定这个域名, 应用后得以苟活.. (自己的域名备案后也是如此), 可以说只要你不介意, 可以多个人使用一个人的备案域名, 只要开对应不同的二级域名跟qiniu绑定即可. (最快方法, 且带CDN加速) - 整体把图都全部迁移 (最可靠的当然是用相对路径, 然后丢gitpage或者自己的云服务器, 缺点在于加载速度慢 ,以及gitpage限制1G大小. 但其实图片压缩后其实也用不完)
不管是思路1还是2, 都有个避不开的事, 就是我们需要整体的修改我们所有markdown文件中之前的图片URL地址为新的. (以及可选的批量压缩). 提前下好之后要用到的qshell这个工具*(go编写,无需其他依赖)*
0x01. 七牛站内迁移
(有备案域名的话)站内迁移工作相对要简单不少, 但是如果你是多个空间(并且不在一个区域的话) ,还是需要考虑一些东西 ,考虑到政策可能不断变化(出尔反尔), 所以建议以前用多个区域的同学都整合到一个吧, 可大幅减少后续迁移成本.
根据不同情况可能用到qshell的listbucket , batchcopy , qdownload , qupload站内迁移大致分为三种情况: (每30天更换一次临时域名的方式我觉得太反人类, 这里就不单独说了)
A. 只用了一个bucket(空间).
那只需要找朋友借到一个备案域名.(或taobao买?) .然后在新增页面绑定完就行, 注意绑定的加速域名一般是填一个没被占用的二级域名, 比如你找朋友借了个域名是xiaoming.com ,那么你这里应该填入img.xiaoming.com (img可以改成任意没被使用的) ,然后qiniu会给你一个cname (对应是img.xiaoming.com.qiniudns.com), 参考这篇绑定完等10min即可 (如果你发现没有绑成功 ,参考这篇一步步排查CNAME配置.) ,绑定OK之后直接在对象存储的资源管理默认域名设置那切换一下, 所有资源就能用新的域名前缀访问了, 比如http://img.xiaoming.com/hehe.jpg . 然后跳到0x03.替换URL
B. 用了多个同一区域(如华东)的bucket.
这个情况也还好, 用qshell的listbucket + batchcopy组合拳搞定, 详细可点开看看文档,这里我以两个同区域的bucket1和bucket2(把1的内容复制到2中), 简单说一下(N个也是一样):
新建一个单独的文件夹比如
qiniu, qshell放在里面运行.先登录账号:qshell account yourAK yourSK(后续操作的基础,不再单独说)文件形式导出待迁移bucket的文件信息,
qshell listbucket bucket1 info.txt, 文件有好几列信息.上面的文件我们是不能直接使用的, 我们需要筛选出其中的文件名为单独的文件. 然后命令加载这些文件名. 如果是win下使用
git-bash运行这些命令:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#1.用下面的命令统计一下空间文件的类型有哪些. (粗略)
cat info.txt | awk '{print $5}' |sort -u #第五列是文件类型
#1.1有同学可能会说,上面这张写法显示的只是HTTP的文件类型,并不精准直观.我就想直接截到后缀名
cat info.txt | awk '{print $1}' |cut -d. -f2| sort -u #使用cut大法截取一下当然可以
#1.2还是有要强的同学说,做个字符串截取后缀,还需要单独的sed/cut啊,我就用awk不行么?sure
cat info.txt | awk '{splite($1,a,"."); print a[2]}' |sort -u #具体用法可查文档
#你会发现还真的漏了不少类型,比如ico,svg,gif,webp (google的新图片格式).
#2.那找出了所有文件格式,我们就知道哪些是我们要同步的后缀(前缀同理).接着我们要获取文件名
cat info.txt | awk '{print $1}' > filename.txt
#3.使用batchcopy命令批量转移,速度很快
$ ./qshell batchcopy -force bucket1 bucket2 filename.txt
# 看到All copyed!提示才说明拷贝成功,没有或者其他说明有问题.
C. 用了多个不同区的bucket(华东/华南)
因为batchcopy 不能跨区, 所以目前只能用最蠢且蛋疼的办法, 先把其他区的文件qdownload依次下到PC, 然后通过qupload依次上传到绑定域名的bucket. 而且最过分的是, 现在qdownload文档说下载功能默认是收费的…除非你先把要迁移的空间绑定备案二级域名 ,两个bucket还凑合, 很多个那真是要命了….自求多福或使用页面内的迁移?
1 | // 这是我写的Win的模板,图片那加了一些. Mac自行修改 |
设置好,确认无误后, 就可以使用qdownload downConf.json 来启动了… (下载/上传并发可设置为10)
同样上传文件有个更多配置选项的json文件, 给出我的模板:
1 | // 此文件命名upConf.json |
设置好,确认无误后, 就可以使用qupload upConf.json 来启动了… 完成后记得cat日志查看结果.
10.17更新: 发现一个一键化的批量迁移页面 ,好处就是你有很多区要集中的话这个很方便, 缺点速度很慢 .并且不支持任何自定义功能, 比如不能只同步某些前后缀. 而且很可能会收费… (这个收费说明很模糊…) 最关键的是,它貌似同步文件多了会卡住, 原因不明, 但是实际小文件已经同步完成了….很蛋疼
0x02. 从七牛迁出
不管迁出到什么地方, 比如有拍还是本地相对路径, 批量修改url的思路跟上面是一样的, 只不过修改的字符串不同罢了. 不同之处是在于如果迁移到gitpage/云服务器, 等于是把图片放在hexo的本地目录下, 那么不压缩的情况下可能严重影响速度.
1.备份
迁出之前先把之前图床的文件备份一次, 即使你本地有图片, 也难免保证缺失和遗漏. 使用qshell的qdownload即可完成备份. (如果你的测试域名已经被封, 那你可以先在同区域新建一个bucket, 然后通过batchopy拷贝, 再下载.)
2.文件压缩
主要是压缩图片, 待补充
3.文件分类
这个是个体力活… 暂时不知道有什么自动化的办法, 分类完使用命令/脚本同理批量替换, 注意 xx/xx/ 的文件名会影响sed 的模式匹配, 稍微修改一下就行.
0x03. 替换文件中URL
这步也是一个关键, 因为实际操作就会发现, 面对复杂的情况, 批量替换并非那么简单的事情… 因为场景不一, 这里先说说简单场景下用自带sed批量一行命令就能替换所有文件, 应该是最快的. 所以先不单独写py脚本.
Hexo的markdown文件都在_posts文件夹中, (如有其他自己整合). 强烈建议先**备份到新的文件夹*操作. (假设原本的域名是oldStr,新的是newStr,路径可自调. 以下Win环境用git-bash实测OK*)
1 | #一行命令递归搞定所有文件字符串替换 (如果你确定所有文件都需要遍历,可以不用grep,更暴力简单) |
调用shell也很简单, 传入2~3个参数(文件路径可选,默认是当前). 执行–>./str.sh oldStr newStr 即可, 大家可以自行优化
0x04.图床高级功能
0.CDN的访问
因为后面的功能都是基于CDN这个基础. 所以先把基本原理搞清楚, 不然后面的高级特性只会更加迷糊,
先看看简单的流程图, 可以看到CDN其实就相当于把你服务器的资源在全国的CDN服务器拷贝了一份,然后就近去取 :
再看看一个更详细的对比流程 (直接访问和通过CDN访问资源):
直接访问不用多说, 就是从客户机器直接去访问服务端机器资源, 比如访问imbajin.com/test.txt . 那如果是设置了CDN后再访问呢?
A. CDN刷新预取 (不等于CDN)
域名绑定其实就是在融合CDN的模块, 也就是说, 如果你选择了思路1 ,继续使用七牛 ,那么你就同时等于有了CDN加速的功能, 而CDN预取 就是在CDN服务器更上一层的CDN缓存服务器对你想加速的文件进行缓存, 访问速度极快(一般在毫秒级别) ,但是目前文件数有限制而且默认只能手动添加(脚本每天跑..)
你可以在此页面配置查看限额, 但是目前预取只支持文件输入, 不支持批量选择文件夹 ,所以可能在上传大文件的时候用途更明显.
B. 到底什么是回源?
先看文档, 大家提起CDN ,经常会听到回源这个词 ,说实话我之前一直没有真正弄清楚到底什么是回源, 什么是回源host , 什么又是整站CDN (我的理解就是, 整个站点有个CDN镜像, 比如每隔一天去同步一下原始数据, 然后用户如果访问imbajin.com ,实际所有静态资源应该都是从CDN站点去取.)
而且这里很多人的解释很不清晰, 这里先把把这个问题举例说清楚.
C. 镜像存储
还是先看文档 , 首先直观来说, 开启之后, 等于把你原本的网站拷贝了一份, 你可以通过访问qiniu的这个加速域名(比如img.xxx.com) , 点开发现是你的网站 (当然, 页面可能是崩坏的)
X.防盗链
这里提供了多种办法, 虽然我是不需要, 但是这里列一下方便以后爬虫爬图的时候….碰到了类似的高级反爬有个解决思路:
时间戳防盗链 :设置密钥,配合签名过期时间来控制资源内容的访问时限
refere防盗链 : 配置 Request Header 中 referer 黑白名单,从而限制访问来源 (最简单)
回源校验防盗链 : (如下图所示很好的解释了整个过程)
IP黑白名单 : 在遇到暴力ddos或者盗刷的时候一键ban掉IP段.
待补充…
参考文章:


