使用对象存储和cdn加速随机图片api

发布于 2020-11-12  66 次阅读


许多博主都会使用随机图片来美化网站,本站也大量使用了随机动漫图片作为主页的背景以及文章的封面。一开始我的图片都是存储在源服务器上,由php随机返回图片链接,从而实现随机图片api。这样做有三个个缺点,一是当访问请求大的时候,网站速度会受限于服务器带宽并且大量消耗流量,二是根据地区不同,访问图片的速度会有区别,特别是从海外访问,如果服务器在国内的话,晚高峰会大量限制图片的打开速度,三是当图片较多时,会占用过多服务器存储空间。因此,使用对象存储来解决服务器容量不足,以及开启cdn加速不同地区访问速度以及减少服务器带宽负载,便成了我的首选方案 (虽然本站并没有多少人访问 lol)。本文将会分享我制作随机图片api的方法, 你也可以上网搜索并使用现有的api,大多数速度也不错,但是如果想自定义图片,可以参考本文。

1. 建立对象存储桶并且使用cdn加速

本文将会使用又拍云对象存储来进行演示,因为他家可以获得10g免费容量和每月15g免费流量,前提是加入又拍云联盟。你也可以使用腾讯云cos以及阿里云oss,也有一定的免费额度。

建立好账号后进入又拍云云存储控制台,点击创建服务。

服务名称随便填,应用场景选择网页图片,加速区域选择国内加速 (由于又拍云国外节点质量一般,我们之后会使用免费的百度云加速来实现境外加速)。新用户需新建授权操作员。最后点击创建完成新建存储桶。

完成创建后,系统会分配测试加速域名,因为只有一个节点仅供测试使用,我们需要绑定域名 (此域名必须经过IPC备案)才能使用全部节点。点击域名绑定,输入已备案的域名,可以使用二级域名。

绑定成功后,在域名服务商添加一个cname解析,线路选择境内 (境外我们选择百度云加速),填入又拍云提供的cname。

待解析生效后,可以使用ipip.net查看全国ping值情况,发现又拍云整体表现还是不错的。

由于又拍云境外加速效果一般,而百度云加速与cloudflare有合作,因此国外加速效果很好,而且百度云加速每天都有10g免费流量,因此不白嫖说不过去了 :) 。

打开百度云加速并且接入域名 (同样需要备案),之后在子域管理加入刚才在又拍云绑定的域名,类型选择cname,同样填入又拍云的cname。

添加完成后可以看到状态那里显示的是一朵绿色的云,与cloudflare 很相似。之后便可以将别名复制,在你域名的服务商添加解析,线路选择境外,这样一来境内访问就会通过又拍云的cdn,而境外就会走百度云加速,也就是cloudflare节点。解析生效后,我们再次使用ipip.net测试延迟,可以看到全网ping值都不错,而且国外节点都是走的cloudflare。

2. 上传图片并且配置Https证书

配置好cdn之后我们可以开始上传我们自己的图片到对象存储桶,使用又拍云的情况下,我们可以点击云存储控制台的文件管理,创建一个新的目录,

上传图片我们可以在网页端直接上传,在图片较多的情况下,我们可以使用又拍云的ftp服务器来操作,具体方法可以参考又拍云官方文档,win10 系统可以使用winscp 来进行ftp远程连接。我这里只上传了6张图片作为演示,刷新目录后可以看到上传的文件。

此时我们还不能直接通过链接访问图片,还需要配置证书,我们可以直接在又拍云申请免费一年的TrueAsia 证书(点击此处),申请成功后,打开对应域名的HTTPS访问,此时便可以通过链接访问存储桶里面的图片了。

对于百度云加速,我们需要导入刚刚申请的证书,在又拍云证书申购下的申请结果下下载申请的证书。之后在百度云加速的证书管理下的证书列表上传证书,填入对应的证书以及私钥 (用文本编辑器打开下载的证书),之后保存,百度云加速会自动部署证书,此时又拍云和百度云加速cdn都可以正常访问存储桶了。

我们还可以开启又拍云的WebP自适应来减少流量消耗。

3. 制作随机图片api

配置完对象存储以及cdn并且上传完图片后,我们可以开始制作api来随机返回图片链接。由于本人并不懂php,此部分参考了这个教程。我们可以在自己站点下创建一个名为api的目录,在其中建立一个img.txt 的文件,里面包含了所有图片的链接,接着创建一个img.php,用来读取并且随机返回img.txt 里面的链接。img.php 的源码如下。

//img.php 源码
<?php
//存有图片链接的文件名img.txt
$filename = "img.txt";
if(!file_exists($filename)){
    die('文件不存在');
}
 
//从文本获取链接
$pics = [];
$fs = fopen($filename, "r");
while(!feof($fs)){
    $line=trim(fgets($fs));
    if($line!=''){
        array_push($pics, $line);
    }
}
 
//从数组随机获取链接
$pic = $pics[array_rand($pics)];
 
//返回指定格式
$type=$_GET['type'];
switch($type){
 
//JSON返回
case 'json':
    header('Content-type:text/json');
    die(json_encode(['pic'=>$pic]));
 
default:
    die(header("Location: $pic"));
}
?>

由于手动添加链接到img.txt 里并不是一个明智之举,因此我们可以写一个python文件使用又拍云sdk来读取所有图片,并且写入到img.txt 文件中。这样同时也方便了后期添加图片,避免手动更新img.txt 文件。Python 代码如下。

#请先运行如下命令
# pip install requests
# pip install upyun

import upyun
import os

service = 'randompics' #服务名称
username = '12345678' #操作员用户名
password = '12345678' #操作员密码
path = '/randompics/' #填写你随机图片在又拍云对象存储里的路径
url = "https://upyun.ioalzx.site" #填写你的cdn域名
file_path = "/www/wwwroot/ioalzx.site/api/img.txt" #填写你img.txt 在服务器里面的路径



up = upyun.UpYun(service, username, password, timeout=30, endpoint=upyun.ED_AUTO) #初始化
res = up.getlist(path) #读取该目录下的图片列表


with open(file_path,'w') as f:
    for i in res:
        f.write(url + path + i["name"]+'\n')

之后在服务器添加定时运行此python文件,如果你使用的是宝塔面板,可以在计划任务里添加。添加完成之后,可以先运行一次此脚本,得到现有图片的链接。

脚本内容如下

#!/bin/bash
# 更换为你python文件的路径
python /www/wwwroot/ioalzx.site/api/autoUp.py 

总结

通过以上的配置,我们就可以愉快的使用自制的随机图片api了,并且速度也是杠杠的,大家还可以开启又拍云的防盗链开关,防止他人使用你的api,还可以使用又拍云图片处理api来获得不同大小的图片。本文提供了刚才建立的api供大家测试,可以点击此处查看生成的图片,记得不要刷新弹出的窗口哦,这样是不会重新获得链接的,必须要重新点击上方的超链接才能看到随机图片的效果。


清醒了岂能再昏睡,觉知了岂能再愚昧,当华美的叶片落尽时,生命的脉络便曆曆可见。