使用cdn-manager自建CDN服务器,支持处理图片/缓存视频等资源

/ 0评 / 0

说明:cdn-manager是云转码express-ffmpeg的作者quazero根据@dadi/cdn制作的脚手架,该原理貌似是一个API服务,搭建好的CDN服务器第一次访问你设定的网站后,会将原站一些资源缓存到服务器,而且不仅仅可以缓存jpgcssjs等,就连tsm3u8mp4也可以缓存,默认是缓存一个小时,但可以设置永久缓存。并且当你的并发很高,硬盘IO跟不上的时候,就把图片转换成二进制存内存里边。更强的就是还可以给图片加参数,如高宽、格式、滤镜、比例、旋转等,然后拉取图片后按要求处理,再实时返回你需要的图片并缓存到服务器。有需求的可以使用延迟比较低的服务器搭建下,可以减轻我们源站压力,特别是并发比较高的网站。

安装

cdn-manager:https://gitee.com/quazero/cdn-manager
dadi/cdn:https://github.com/dadi/cdn

本教程适用于CentOS,建议使用CentOS 7系统。

1、安装依赖

<span class="hljs-meta">#</span><span class="bash">升级系统</span>
yum update -y
<span class="hljs-meta">#</span><span class="bash">安装开发者工具包</span>
yum -y groupinstall "Development Tools"
<span class="hljs-meta">#</span><span class="bash">安装nodejs</span>
curl -sL https://rpm.nodesource.com/setup_10.x | bash -
yum install nodejs -y
<span class="hljs-meta">#</span><span class="bash">安装pm2</span>
npm install pm2 -g

2、安装程序

<span class="hljs-comment">#拉取源码</span>
git <span class="hljs-built_in">clone</span> https://gitee.com/quazero/cdn-manager.git
<span class="hljs-built_in">cd</span> cdn-manager
<span class="hljs-comment">#安装</span>
npm install
<span class="hljs-comment">#设置环境</span>
<span class="hljs-built_in">export</span> NODE_ENV=production

3、配置参数

注意:本步骤讲的默认配置只缓存图片,所以我们要了解下基本配置,然后再去参考文章最后面的更多设置,再使用4步骤运行程序。

本程序主要涉及到2个配置文件poster.jsonconfig.production.json,前者是图片处理的配置文件,后者是运行环境配置文件。

图片配置路径workspace/recipes/poster.json,默认参数如下:

{
  <span class="hljs-attr">"recipe"</span>: <span class="hljs-string">"poster"</span>,
  <span class="hljs-attr">"settings"</span>: {
    <span class="hljs-attr">"format"</span>: <span class="hljs-string">"jpg"</span>,
    <span class="hljs-attr">"quality"</span>: <span class="hljs-string">"90"</span>,
    <span class="hljs-attr">"height"</span>: <span class="hljs-string">"240"</span>,
    <span class="hljs-attr">"ratio"</span>: <span class="hljs-string">"16-9"</span>,
    <span class="hljs-attr">"resizeStyle"</span>: <span class="hljs-string">"entropy"</span>
  }
}

意思是将图片处理成16:9的比例,高度240PX,并且格式为jpg,质量为90%的格式。

运行环境配置路径config/config.production.json,默认参数如下:

{
  <span class="hljs-attr">"server"</span>: {
    <span class="hljs-attr">"host"</span>: <span class="hljs-string">"127.0.0.1"</span>,
    <span class="hljs-attr">"port"</span>: <span class="hljs-number">8001</span>
  },
  <span class="hljs-attr">"images"</span>: {
    <span class="hljs-attr">"remote"</span>: {
      <span class="hljs-attr">"enabled"</span>: <span class="hljs-literal">true</span>,
      <span class="hljs-attr">"path"</span>: <span class="hljs-string">"#"</span>
    }
  }
}

意思是运行端口为8001,设置远程连接path,比如我的域名是https://www.moerats.com,就在参数后面填该域名。

4、运行程序

<span class="hljs-meta">#</span><span class="bash">进入源码的文件夹</span>
cd /root/cdn-manager
<span class="hljs-meta">#</span><span class="bash">这里避免出错,建议安装一些模块</span>
npm install sharp farmhash
<span class="hljs-meta">#</span><span class="bash">运行</span>
pm2 start index.js

运行环境配置

1、缓存设置

<span class="hljs-string">"caching"</span>: {
  <span class="hljs-string">"ttl"</span>: <span class="hljs-number">3600</span>,
  <span class="hljs-string">"expireAt"</span>: <span class="hljs-string">"0 5 0 * * *"</span>
}

expireAt配置解释:

<span class="hljs-string">"0 5 0 * * _"</span> 每天凌晨<span class="hljs-number">12</span>点<span class="hljs-number">5</span>分刷新缓存
<span class="hljs-string">"0 30 11 _ _ 1-5"</span> 每周星期一到星期五 早上<span class="hljs-number">11</span>点<span class="hljs-number">30</span>刷新缓存
<span class="hljs-string">"0 15 14 1 _ _"</span> 每个月一号下午<span class="hljs-number">2</span>点<span class="hljs-number">15</span>刷新缓存
<span class="hljs-string">"0 22 _ _ 1-5"</span> 周一到周五晚上<span class="hljs-number">10</span>点刷新缓存
<span class="hljs-string">"_ 5 4 * * 0"</span> 每周日凌晨<span class="hljs-number">4</span>点<span class="hljs-number">5</span>分刷新缓存

ttl配置解释:

单位秒,默认3600秒,一个小时缓存失效,可以自行设置时长。
/api/<span class="hljs-keyword">flush</span>可以通过这个API手动刷新缓存文件。

2、image配置

<span class="hljs-string">"images"</span>: {
  <span class="hljs-string">"directory"</span>: {
    <span class="hljs-string">"enabled"</span>: <span class="hljs-literal">true</span>,
    <span class="hljs-string">"path"</span>: <span class="hljs-string">"relative/path/to/your/images"</span>
  },
  <span class="hljs-string">"remote"</span>: {
    <span class="hljs-string">"enabled"</span>: <span class="hljs-literal">true</span>,
    <span class="hljs-string">"path"</span>: <span class="hljs-string">"https://www.moerats.com/images"</span>
  },
  <span class="hljs-string">"s3"</span>: {
    <span class="hljs-string">"enabled"</span>: <span class="hljs-literal">true</span>,
    <span class="hljs-string">"accessKey"</span>: <span class="hljs-string">"your-access-key"</span>,
    <span class="hljs-string">"secretKey"</span>: <span class="hljs-string">"your-secret"</span>,
    <span class="hljs-string">"bucketName"</span>: <span class="hljs-string">"your-bucket"</span>,
    <span class="hljs-string">"region"</span>: <span class="hljs-string">"your-region"</span>,
    <span class="hljs-string">"endpoint"</span>: <span class="hljs-string">"ams3.digitaloceanspaces.com"</span>
  }
}

images配置项 一共有三种用法,一种是直接服务同主机图片,服务本地图片,一种是服务远程图片,最后一种是亚马逊和Digital Ocean Space云储存。

directory服务本地文件,直接指定path为文件夹地址即可直接处理本地图片。例如/www/moerats.com/picture,然后将图片地址host更改为CDN地址即可。

remote服务远程文件,直接设置path为远程url,例如https://www.moerats.com,最后把地址替换成 cdn地址即可。

s3云储存可扩展的云储存,可以直接缓存各种云储存上边的图片。

3、assets配置

<span class="hljs-string">"assets"</span>: {
  <span class="hljs-string">"directory"</span>: {
    <span class="hljs-string">"enabled"</span>: <span class="hljs-literal">true</span>,
    <span class="hljs-string">"path"</span>: <span class="hljs-string">"/Users/absolute/path/to/your/assets"</span>
  }
}

该配置方法参考image配置,除了把images换成assets,其他用法一样,设置之后会缓存除了jpg的各种文件,包括视频文件。

图片处理配置

{
  <span class="hljs-attr">"recipe"</span>: <span class="hljs-string">"poster"</span>,
  <span class="hljs-attr">"settings"</span>: {
    <span class="hljs-attr">"format"</span>: <span class="hljs-string">"jpg"</span>,
    <span class="hljs-attr">"quality"</span>: <span class="hljs-string">"90"</span>,
    <span class="hljs-attr">"height"</span>: <span class="hljs-string">"240"</span>,
    <span class="hljs-attr">"ratio"</span>: <span class="hljs-string">"16-9"</span>,
    <span class="hljs-attr">"resizeStyle"</span>: <span class="hljs-string">"entropy"</span>
  }
}

recipe文件是预配置格式处理文件,在workspace/recipes文件夹中建立。

"recipe"参数设置必须和文件名一致。settings中可以设置的选项:

<span class="hljs-attribute">blur</span> 模糊
filter 设置裁剪处理算法
flip 翻动
format 格式
gravity 设置裁剪区域
ratio 比例
rotate 旋转
width 宽度
height 高度

resizeStyle裁剪模式 推荐entropy等,详见dadi/cdn文档。

设置完成之后,比如recipeposter,则访问链接为cdnhost/poster/yourpath/1.jpg

域名反代

要想正常访问就需要使用域名反代,这里说下宝塔反代和Caddy反代。如果你网站有宝塔,就可以使用宝塔进行反代,如果没有,建议使用第2种的Caddy反代,配置很快。

1、宝塔反代
先进入宝塔面板,然后点击左侧网站,添加站点,然后再点击添加好了的域名名称,这时候就进入了站点配置,点击反向代理,目标URL填入http://127.0.0.1:8001,再启用反向代理即可。至于启用SSL就不说了,直接在站点配置就可以看到。

2、Caddy反代
安装Caddy

<span class="hljs-attribute">wget</span> -N --<span class="hljs-literal">no</span>-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/caddy_install.sh && chmod +x caddy_install.sh && bash caddy_install.sh install http.filemanager
<span class="hljs-comment">#备用地址</span>
wget -N --<span class="hljs-literal">no</span>-check-certificate https://www.moerats.com/usr/shell/Caddy/caddy_install.sh && chmod +x caddy_install.sh && bash caddy_install.sh install http.filemanager

配置Caddy

<span class="hljs-comment">#以下全部内容是一个整体,请修改域名后一起复制到SSH运行!</span>

<span class="hljs-comment">#http访问,该配置不会自动签发SSL</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"xx.com {
 gzip
 proxy / http://127.0.0.1:8001
}"</span> > /usr/<span class="hljs-built_in">local</span>/caddy/Caddyfile

<span class="hljs-comment">#https访问,该配置会自动签发SSL,请提前解析域名到VPS服务器</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"xx.com {
 gzip
 tls admin@moerats.com
 proxy / http://127.0.0.1:8001
}"</span> > /usr/<span class="hljs-built_in">local</span>/caddy/Caddyfile

tls参数会自动帮你签发ssl证书,如果你要使用自己的ssl,改为tls /root/xx.crt /root/xx.key即可。后面为ssl证书路径。

启动Caddy

/etc/init.d/caddy <span class="hljs-keyword">start</span>

最后我们都配置好了后,只需要在原网站将资源链接域名替换成CDN的地址即可。大概使用如下:

原图片地址为:https:<span class="hljs-comment">//www.moerats.com/rats.jpg</span>
CDN中地址为:https:<span class="hljs-comment">//cdn.moerats.com/poster/rats.jpg,该链接会自动处理图片</span>

<span class="hljs-meta">#如果你不想对图片进行处理,直接代替原域名就可以了,如:</span>
https:<span class="hljs-comment">//cdn.moerats.com/rats.jpg</span>

<span class="hljs-meta">#其他资源就直接替换域名为CDN地址即可</span>

发表评论