一、前言
本文记录一下使用 [Cdnfly – 自建cdn|防CC攻击|cdn软件|cdn系统] 搭建CDN系统,保姆级教程 适合小白食用
个人感觉自建CDN
和反代网站
效果都差不多,都可以实现加速 缓存 防攻击等功能,但我暂时还不是很懂nginx相关配置,相较而言 自建CDN更容易批量维护和管理各节点
官方安装文档:安装说明 · Cdnfly使用文档
二、准备
主控和被控均不能在 已安装nginx的情况下 执行安装命令,必须确保80 443端口未被占用!!!
系统必须为centos7或ubuntu16.04 !!! debian11 ubuntu20 centos8 centos6等系统都不支持
主控需开放80 88 443 9200端口
节点需要开放 80 443 5000端口
- 一台最小4GB内存的服务器(vps)做主控(cdn面板控制台)
- 若干服务器做CDN节点
- 系统:cdnfly主控和被控节点暂时仅支持Centos-7和Ubuntu 16.04系统
本文以一台centos7系统的hetzner 4GB内存vps 做主控
一台任何系统的vps 搭建伪装授权站点,即cdnfly自建云端
一台centos7系统的DO纽约 512MB内存vps 做节点2 接管中国大陆移动以及海外等其他流量
一台centos7系统的DO新加坡 512MB内存vps 做节点2 接管中国大陆的电信和联通流量
为什么用DO 主要是我就知道这一家有0.5GB小内存,虽然这款比一些4GB内存的都贵 但为了测试512MB内存可用 还是选择了DO
为什么CDN节点机器用0.5GB内存小鸡 大部分廉价的国内优化机器只有0.5GB内存
三、cdnfly自建云端
有cdnfly官方授权的可跳过这一步
因为我就是临时个人测试使用,官方那个有些贵
盗版可耻 开发不易 有条件请用正版
cdnfly自建云端搭建方法:
用附件中的包搭建一个站点,绑定域名auth.cdnfly.cn、monitor.cdnfly.cn ,并根据文件中的nginx伪静态配置设置伪静态。
我用宝塔搭建大概为这样:
四、主控服务器设置
主控需要开放 80 88 443 9200端口,并且主控和节点机不能安装在同一机器上,会导致80端口冲突
主控若未开启9200 88端口 会导致程序大量占用CPU直至死机,如有任何问题 建议重置elasticsearch
修改主控vps的hosts文件
修改主控vps的hosts文件,将 auth.cdnfly.cn、monitor.cdnfly.cn 这2个域名指向刚才的自建云端服务器IP
修改hosts意义是 主控vps请求 auth.cdnfly.cn
monitor.cdnfly.cn
这两个网站的内容会直接去本地服务器请求,这样就绕过了官方服务器的验证
安装cdnfly控制面板
出现上图页面即安装成功,通过 IP 直接访问即可
五、CDN节点服务器配置
我用了两台做CDN节点,节点需要开放80 443 5000端口
一台centos7系统的DO纽约 512MB内存vps 做节点2 接管中国大陆移动以及海外等其他流量
一台centos7系统的DO新加坡 512MB内存vps 做节点2 接管中国大陆的电信和联通流量
1.添加SWAP虚拟内存
1GB内存及以下的小鸡必须添加SWAP否则会报错,2GB以上内存的vps可自行决定是否添加SWAP
2.安装被控服务
进入cdnfly管理员控制台>>系统管理>>系统升级,复制节点安装命令并在节点1和节点2等CDN节点服务器执行
下图即为安装成功,cdnfly被控服务会自己安装nginx等
3.安装BBR网络加速
Centos安装BBR用以下这条命令或自行百度
4.卸载节点
如果节点想换到另一台主控或者不想占用80 443 ,可以执行以下脚本卸载节点
六、cdnfly控制台必要配置
官方安装文档:安装说明 · Cdnfly使用文档
1、添加CDN节点
即主控与被控服务建立连接,添加方法如下图
会提示先修改密码,修改密码在:系统管理>>用户管理>>新增
1GB内存小鸡通常会出现 同步cc_filter nginx openresty
以下报错,这是因为内存不够 解决办法是添加虚拟内存即可
2、DNS设置
DNS设置可配置通过API来与第三方DNS提供商无缝对接,来生成网站的CNAME
目前支持aliyun,国内版dnspod,dns.com、dns.la 和cloudflare.com
获取密钥具体参考官方 DNS设置
3、线路分组 设置分线路解析
只有 DNS服务商 支持分线路解析才可以设置分线路解析
例如cloudflare这类国外DNS服务就不支持分线路解析
还可以为IP设置权重,权重越大用户访问该IP相对越多
4、添加套餐
- 名称 – 套餐名称,用户端也会显示这个
- 描述 – 套餐的说明,也会显示到用户端的套餐购买列表
- 分配给用户 – 输入用户的id,表示指定该套餐为该用户的专属套餐,只有这个用户能购买此套餐
- 线路分组 – 上一步添加的线路组,或其它分组,决定网站绑定此套餐后网站配置分发到的节点,以及cname解析的IP
- 套餐分组 – 为套餐分组,分组也会显示到用户端的套餐购买页面,方便归类购买
- CNAME域名 – 生成网站cname使用的域名,默认为之前dns设置中的主域名,可以输入其它的域名,但此域名必须跟主域名在同一个dns账号下。
- 月流量 – G为单位,限制该套餐一个自然月内使用流量的上限
- 域名数 – 该套餐允许的域名数量,域名数量包括裸域名及各级域名,如www.cdnfly.cn cdnfly.cn算两域名
- HTTP非80,443端口数 – http可以输入非80,443的端口,此项可以限制非标端口的数量,不允许的话设置为0
- 四层转发端口数 – 四层转发允许的端口数
- 自定义CC规则 – 如果此项为允许,用户则可以创建自己的cc规则,并绑定到网站使用。如果为禁止,则用户只允许选择系统内置的规则
- 排序 – 默认100,小值排在前面
- 带宽为负值表示无限制
- 连接数为负值表示不限制连接数
5、添加网站
用管理员权限在 系统管理>>用户管理 创建一个用户 test
以 test 用户登录 然后购买免费的高级套餐,在网站管理>>分组管理>>新增分组后就可以添加网站了
6、节点监控介绍
此节内容于2023.4.24补充,我的云端伪装站点只可以使用http监控,tcp ping监控均无法生效,目前不知到什么原因
#2023.6.17更新 此IP可以tcp监控,看来是宝塔等问题
#51.81.222.246 auth.cdnfly.cn monitor.cdnfly.cn
cdnfly节点自动切换的规则:
cdnfly的节点监控支持主节点宕机自动暂停 并删除该条DNS解析记录
如果设置了备用节点会用一个备用节点替换已失效的主节点 并同步DNS解析记录
当主节点再次恢复正常,cdnfly自动启用主节点并且取消使用备用节点,同时DNS会增加主节点DNS记录删去备用节点的解析记录
以上操作均为系统自动执行无需人工干预,可以选择配置SMTP发信服务,可以收到 节点失效/节点恢复/切换操作 等通知
7、单节点设置
可以限制节点机器的文件缓存大小(不要超过vps硬盘本身大小)
可以设置节点出站速度(100Mbps=12.5MB/s)
8、禁用API(多用户必设置)(重要重要重要!!!)
2023.5.21 cdnfly5.1.13存在重大漏洞,普通用户生成的API通过某些方法可以拿到管理员权限,解决方法就是禁用API,首先在 cdnfly控制台
> 系统管理
> 系统设置
> 用户相关
> 限制普通用户只能从此域名登录
和限制管理员只能从此域名登录
再依次在这两个登录域名设置 禁止 /v1/ 的所有访问,5.1.13版本的 /v1
路径是执行api的必要路径,封禁就可以避免被黑了*
限制cdnfly从域名登录是避免从源站ip访问到了api
限制管理员是二次防火墙,如果黑客获取了权限,但是不知道你的管理员登录地址,他就只能对普通用户更改
七、cdnfly控制台推荐配置
1、设置CC防护
这个根据自己需要设置就好了,还可以自定义CC规则
比如设置单IP 10s内最大访问 329.tanglu.cf 资源数为100,单个资源最大次数为20
这个防一般的单IP CC攻击很有效,推荐设置
一些发卡站避免被机器人检查可以设置访问该域名需要点击验证
2、设置CDN缓存文件类型
这个也是根据自己网站的资源类型,以下是我博客的设置
缓存设置建议参考官方文档:缓存配置 · Cdnfly使用文档
默认为不缓存任何文件
3、设置CDN节点服务器缓存大小和最大带宽
4、申请证书
cdnfly的证书是自动续签的
cdnfly申请证书很简单有两种方法
一种是在 网站管理
> 证书管理
> 我的证书
中申请证书
当然也可以上传自己的证书
如果没有申请成功,可以在 我的网站
> 高级配置
中开启 /.well-known/acme-challenge/请求回源
八、cdnfly控制台其他配置
1、短信/邮箱提示
2、对接支付
3、转发
转发容易封禁端口,不建议用CDN服务器做转发
4、面板通过域名访问
直接套cloudflare,或者套其它CDN,也可以用其他机器反代 但感觉没必要
5、节点监控和宕机自动切换
需要配置SMTP节点超时会提示和开启宕机自动切换自动切换
6、cdnfly设置反代
这个功能就是指定回源host,实现反代的功能
比如想给R2套第三方CDN就需要在第三方CDN配置回源host指向R2的绑定域名
举个指定CDN回源host,实现反代的功能的例子:
源站 A,现在用 B 反代源站 ,如果直接给B配置普通CDN CDN设置回源站点是 A,CDN解析出A的IP 2.2.2.2 然后发送http请求为 ‘’域名B IP2.2.2.2’,因为源站点没有配置B这个站点 访问就会报错。但是CDN设置指定回源HOST为A,CDN设置回源请求就是 ‘IP是2.2.2.2 回源域名是 A’,这样就可以成功访问了
九、备份和恢复
cdnfly提供了非常简单的备份和恢复功能
1、备份
主控默认会每两小时备份数据库,备份默认保留7天(可以自行修改保留天数),备份文件在 /data/backup/cdn/
除了备份数据库,还需要备份 /opt/cdnfly/master/conf
文件夹下的 config.py
文件(其实记住AES_KEY和LOG_PWD就行了)
恢复时只需要用到这两个文件,为了防止主控失联,建议每天上传备份
2、恢复
此操作参考cdnfly官网,亲测有效
旧主控:
将旧主控 /data/backup/cdn/
下的某个时间的数据库备份包 如 mysql-20230724-010931.sql.gz
下载到本地,重命名为 cdn.sql.gz
将旧主控的 /opt/cdnfly/master/conf/config.py
文件也下载下来
关闭旧主控,这里记得关闭,如果不关闭的话新旧主控同时运行会出现后台任务只创建但不执行,导致新主控无法正常运行
新主控:
首先正常执行安装主控命令:
如果有需要自授权请先搭建云端 修改hosts
curl -fsSL https://github.com/heardic/cdnfly-kaixin/raw/main/master.sh -o master.sh && chmod +x master.sh && ./master.sh --es-dir /home/es
然后ssh连接新主控,恢复备份和config. py,初始化es
#进入主控root目录
cd /root
#将上节备份的数据库文件 cdn.sql.gz 上传到root目录
#在root目录下执行以下两条命令 恢复数据库
curl http://us.centos.bz/cdnfly/restore_master.sh -o restore_master.sh && chmod +x restore_master.sh
./restore_master.sh
#将上节备份的旧主控 /opt/cdnfly/master/conf/config.py 上传新主控相同位置,实现替换掉新主控的config.py文件
#依次执行以下四条命令初始化elasticsearch
cd /tmp
vim int_es.sh(把下面的sh脚本粘贴进去)
chmod +x int_es.sh
./int_es.sh /home/es
supervisorctl -c /opt/cdnfly/master/conf/supervisord.conf restart all
#至此主控设置完成,通过旧主控的账号密码进入可以发现 节点 用户 网站 日志 dns等都恢复了
#接下来只需要对旧节点更换IP即可
#!/bin/bash -x
set -o errexit
#判断系统版本
check_sys(){
local checkType=$1
local value=$2
local release=''
local systemPackage=''
local packageSupport=''
if [[ "$release" == "" ]] || [[ "$systemPackage" == "" ]] || [[ "$packageSupport" == "" ]];then
if [[ -f /etc/redhat-release ]];then
release="centos"
systemPackage="yum"
packageSupport=true
elif cat /etc/issue | grep -q -E -i "debian";then
release="debian"
systemPackage="apt"
packageSupport=true
elif cat /etc/issue | grep -q -E -i "ubuntu";then
release="ubuntu"
systemPackage="apt"
packageSupport=true
elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat";then
release="centos"
systemPackage="yum"
packageSupport=true
elif cat /proc/version | grep -q -E -i "debian";then
release="debian"
systemPackage="apt"
packageSupport=true
elif cat /proc/version | grep -q -E -i "ubuntu";then
release="ubuntu"
systemPackage="apt"
packageSupport=true
elif cat /proc/version | grep -q -E -i "centos|red hat|redhat";then
release="centos"
systemPackage="yum"
packageSupport=true
else
release="other"
systemPackage="other"
packageSupport=false
fi
fi
echo -e "release=$release\nsystemPackage=$systemPackage\npackageSupport=$packageSupport\n" > /tmp/ezhttp_sys_check_result
if [[ $checkType == "sysRelease" ]]; then
if [ "$value" == "$release" ];then
return 0
else
return 1
fi
elif [[ $checkType == "packageManager" ]]; then
if [ "$value" == "$systemPackage" ];then
return 0
else
return 1
fi
elif [[ $checkType == "packageSupport" ]]; then
if $packageSupport;then
return 0
else
return 1
fi
fi
}
# 停止主控程序
supervisorctl -c /opt/cdnfly/master/conf/supervisord.conf stop all
# 恢复mysql
eval `grep MYSQL_PASS /opt/cdnfly/master/conf/config.py`
eval `grep MYSQL_IP /opt/cdnfly/master/conf/config.py`
eval `grep MYSQL_PORT /opt/cdnfly/master/conf/config.py`
eval `grep MYSQL_DB /opt/cdnfly/master/conf/config.py`
eval `grep MYSQL_USER /opt/cdnfly/master/conf/config.py`
mysql -h$MYSQL_IP -u$MYSQL_USER -p$MYSQL_PASS -P$MYSQL_PORT -e "drop database $MYSQL_DB;create database $MYSQL_DB;"
gunzip < /root/cdn.sql.gz | mysql -h$MYSQL_IP -u$MYSQL_USER -p$MYSQL_PASS -P$MYSQL_PORT $MYSQL_DB
# 关闭维护模式
mysql -h$MYSQL_IP -u$MYSQL_USER -p$MYSQL_PASS -P$MYSQL_PORT $MYSQL_DB -e "update config set value='{\"enable\":0,\"msg\":\"维护中,请稍候重试\"}' where name='maintain' "
# 启动主控程序
supervisorctl -c /opt/cdnfly/master/conf/supervisord.conf start all
旧节点:
需要将旧节点的旧主控IP替换为新主控的IP
1.新建sh脚本
vim change_ip.sh(粘贴下方的脚本)
2.chmod +x change_ip.sh && bash change_ip.sh your_new_ip
new_master_ip=$1
sed -i "s/ES_IP =.*/ES_IP = \"$new_master_ip\"/" /opt/cdnfly/agent/conf/config.py
sed -i "s/MASTER_IP.*/MASTER_IP = \"$new_master_ip\"/g" /opt/cdnfly/agent/conf/config.py
sed -i "s/hosts:.*/hosts: [\"$new_master_ip:9200\"]/" /opt/cdnfly/agent/conf/filebeat.yml
sed -i "s#http://.*:88#http://$new_master_ip:88#" /usr/local/openresty/nginx/conf/listen_80.conf /usr/local/openresty/nginx/conf/listen_other.conf
ps aux | grep [/]usr/local/openresty/nginx/sbin/nginx | awk '{print $2}' | xargs kill -HUP || true
supervisorctl -c /opt/cdnfly/agent/conf/supervisord.conf restart filebeat
supervisorctl -c /opt/cdnfly/agent/conf/supervisord.conf restart agent
supervisorctl -c /opt/cdnfly/agent/conf/supervisord.conf restart task
新节点:
新节点安装方式和旧节点安装方式一样,只需要将旧主控IP修改为新主控IP 密码修改为旧主控密码即可
旧主控密码忘记了可以在 /opt/cdnfly/master/conf/config.py
可以找到
暂无评论内容