0. 环境要求
- 主控和被控均不能在已安装nginx的情况下执行安装命令
- 系统必须为centos7或ubuntu16.04
- 主控需开放80 88 443 9200端口
- 节点需要开放 80 443 5000端口
- 主控需要至少4G内存(我装完后占用4.33G,可能至少6-8G内存比较合适)
- 被控建议2G内存起步,我囊中羞涩,使用0.5G和1G小鸡开swap测试
1. 搭建授权服务器(自建云端)
使用用以下源码搭建一个站点(在随便另一个服务器)
https://vkceyugu.cdn.bspapp.com/VKCEYUGU-10b3891b-be67-4103-a60f-9da1d057470c/b46c7891-1c1a-486e-96f5-a47daa1f8535.zip
绑定域名
auth.cdnfly.cn
monitor.cdnfly.cn
伪静态
location / {
if (!-e $request_filename){
rewrite ^(.*)$ /index.php/$1 last; break;
}
}
文件直接解压到网站目录
备注:
监控默认是使用云端服务器去请求CDN节点,因此要保持云端和CDN节点之间的网络畅通。另外如果是用宝塔面板,php不要安装bt_safe扩展,否则无法使用tcp类型监控;如果要用ping类型监控,还需要允许exec函数。
支持多节点监控(和官方一样),要添加其它监控节点,可以编辑config.php配置文件,根据里面的注释说明添加。
2. 安装CDN主控
2.1 开放相关端口
主控需要开放 80 88 443 9200端口,并且主控和节点机不能安装在同一机器上,会导致80端口冲突
主控若未开启9200 88端口 会导致程序大量占用CPU直至死机,如有任何问题 建议重置elasticsearch
要查看指定端口是否在 CentOS 上开放,可以使用以下命令:
# 安装FirewallD
yum install firewalld
# 启动FirewallD
systemctl start firewalld
# 设置开机启动FirewallD
systemctl enable firewalld
# 检查是否开启FirewallD
systemctl is-enabled firewalld
# 检查指定端口是否开启
sudo firewall-cmd --zone=public --query-port=<port_number>/tcp
如果端口开放,将返回 yes
,如果端口关闭,则返回 no
。
要在 CentOS 上开放指定端口,并重新加载防火墙配置以使更改生效,可以使用以下命令:
# 开启 80 88 443 9200 端口
firewall-cmd --zone=public --add-port=80/tcp --add-port=88/tcp --add-port=443/tcp --add-port=9200/tcp
# 重新加载防火墙配置以使更改生效
sudo firewall-cmd --reload
2.2 修改主控服务器的hosts文件
修改主控vps的hosts文件,将 auth.cdnfly.cn、monitor.cdnfly.cn 这2个域名指向刚才的自建云端服务器IP
vim /etc/hosts
#添加以下内容,记得替换为你自己搭建的IP
<你的自建云端ip> auth.cdnfly.cn monitor.cdnfly.cn
检查hosts是否生效
ping auth.cdnfly.cn
ping monitor.cdnfly.cn
如果都返回 <你的自建云端ip> 说明hosts修改已经生效
2.3 安装cdnfly控制面板
更新centos源
yum update -y
控制面板占用3GB内存,内存不足会安装失败
curl -fsSL https://github.com/Steady-WJ/cdnfly-kaixin/raw/main/master.sh -o master.sh && chmod +x master.sh && ./master.sh --es-dir /home/es
安装完成后可以直接访问ip登录,这里为了方便后续配置,把要绑定的域名直接通过cloudflare解析到主控ip,然后通过域名访问。
初始密码:
管理员账号和密码: wenjian/wenjian
普通用户账号和密码: ceshi/ceshi
3. 禁用API以阻止提权漏洞
cdnfly5.1.13存在重大漏洞,虽然官方最新版早已修复,但未更改授权方式,能够开心的版本仍存在此漏洞。普通用户生成的API通过某些方法可以拿到管理员权限,这里通过禁用api解决。
首先在 cdnfly控制台
> 系统设置
> 系统设置
> 用户相关
> 限制普通用户只能从此域名登录
和限制管理员只能从此域名登录
填写之前绑定的域名。
再禁止路径中含有 /v1/
的所有请求。因为5.1.13版本的 /v1/
路径是执行api的必要路径。
在clouflare中设置防火墙规则:
4. 添加CDN节点
为了使不同运营商尽可能直连,我添加了三个测试节点
- Centos 7 新加坡节点 0.5G 内存,接管联通流量
- Centos 7 首尔节点 1G 内存,接管联通流量
- Centos 7 东京节点 1G 内存,接管移动、电信流量
我发现最近日本直连越来越多了,没必要去挤香港
中国大陆以外流量通过使用saas解析给cloudflare,具体参考这篇文章 https://www.thsink.com/notes/541/
4.1 更新centos7源
yum update -y
4.2 添加SWAP虚拟内存
1GB内存及以下的小鸡必须添加SWAP否则会报错,2GB以上内存的vps可自行决定是否添加SWAP
# 检查系统上是否已经存在swap分区, 如果没有任何输出,表示系统当前没有启用swap分区
swapon --show
# 使用dd命令创建/home/swap这么一个分区文件。文件的大小是1024000个block,一般情况下1个block为1K,所以这里空间是1000MB
dd if=/dev/zero of=/home/swap bs=1024 count=1024000
# 接着再把这个分区变成swap分区
/sbin/mkswap /home/swap
# 设置文件的权限,以防止非特权用户访问:
sudo chmod 600 /home/swap
# 使用这个swap分区,使其成为有效状态
/sbin/swapon /home/swap
# 现在再用 free -m 命令查看一下内存和swap分区大小
swapon --show
# 让系统在启动时自动启用swap分区, 需要将swap文件的信息添加到`/etc/fstab`文件中。打开该文件并在末尾添加以下行:
#vim /etc/fstab
/home/swap swap swap defaults 0 0
4.3 开启bbr
很早前收藏的脚本了,不知道有没有新版,建议开启bbr原版+fq
wget -N --no-check-certificate "https://github.000060000.xyz/tcp.sh" && chmod +x tcp.sh && ./tcp.sh
4.4 安装被控服务
开启端口
# 安装FirewallD
yum install firewalld
# 启动FirewallD
systemctl start firewalld
# 设置开机启动FirewallD
systemctl enable firewalld
# 检查是否开启FirewallD
systemctl is-enabled firewalld
# 开启 80 443 5000 端口
firewall-cmd --zone=public --add-port=80/tcp --add-port=443/tcp --add-port=5000/tcp
# 重新加载防火墙配置以使更改生效
sudo firewall-cmd --reload
进入cdnfly管理员控制台>>系统管理>>系统升级,复制节点安装命令并在CDN节点服务器(被控)执行
安装成功后会有提示:
4.5 在控制台添加cdn节点
在 节点管理>节点管理 新增节点,输入ip后确认,节点会自动配置
添加完成后,点击节点名称,选择节点设置,可以修改带宽限制和缓存上限。
添加完成后,可以在系统升级中看见节点。
如果1G内存小鸡出现同步cc_filter nginx openresty
等错误,很有可能是内存不足,检查是否开启了swap。我这里测试使用512MB内存小鸡开启1G swap后可以正常同步。
部分服务商的centos7系统会报错 “重载resty配置失败:set-dict接口错误,可能节点未初始化成功,请尝试禁用启用节点”,一直是配置中,如果重启仍报错的话就是系统问题,这时候需要自行DD centos7
4.6 卸载节点
如果节点想换到另一台主控或者不想占用80 443 ,可以执行这条命令卸载节点
cd /tmp/ && curl -m 5 http://dl2.cdnfly.cn/cdnfly/agent_uninstall.sh -o agent_uninstall.sh || curl -m 5 http://us.centos.bz/cdnfly/agent_uninstall.sh && chmod +x agent_uninstall.sh && ./agent_uninstall.sh
5. 控制台配置
5.1 DNS设置
参考官方说明 http://doc.cdnfly.cn/DNSshezhi.html
使用cloudfaredns不支持线路设置权重和分运营商解析
5.2 设置分线路解析
通常国内dns服务商才支持分(运营商)线路解析。
在设置解析里可以设置分线路解析以及主备节点、节点权重
5.3 添加套餐
名称 - 套餐名称,用户端也会显示这个
描述 - 套餐的说明,也会显示到用户端的套餐购买列表
分配给用户 - 输入用户的id,表示指定该套餐为该用户的专属套餐,只有这个用户能购买此套餐
线路分组 - 上一步添加的线路组,或其它分组,决定网站绑定此套餐后网站配置分发到的节点,以及cname解析的IP
套餐分组 - 为套餐分组,分组也会显示到用户端的套餐购买页面,方便归类购买
CNAME域名 - 生成网站cname使用的域名,默认为之前dns设置中的主域名,可以输入其它的域名,但此域名必须跟主域名在同一个dns账号下。
月流量 - G为单位,限制该套餐一个自然月内使用流量的上限
域名数 - 该套餐允许的域名数量,域名数量包括裸域名及各级域名,如www.cdnfly.cn cdnfly.cn算两域名
HTTP非80,443端口数 - http可以输入非80,443的端口,此项可以限制非标端口的数量,不允许的话设置为0
四层转发端口数 - 四层转发允许的端口数
自定义CC规则 - 如果此项为允许,用户则可以创建自己的cc规则,并绑定到网站使用。如果为禁止,则用户只允许选择系统内置的规则
排序 - 默认100,小值排在前面
带宽为负值表示无限制
连接数为负值表示不限制连接数
5.4 添加网站
网站管理-所有网站-新增
添加网站并将域名cname解析后可以使用cdnfly申请ssl,也可以自己上传证书开启。
6. 其他配置
按需设置缓存规则和cc规则,配置邮件通知,调整日志保存天数
cdnfly设置反代
这个功能就是指定回源host,实现反代的功能
比如想给R2套第三方CDN就需要在第三方CDN配置回源host指向R2的绑定域名
举个指定CDN回源host,实现反代的功能的例子:
源站 blog.tanglu.me,现在用 blog.tang.lu 反代源站 ,如果直接给blog.tang.lu配置普通CDN CDN设置回源站点是 blog.tanglu.me,CDN解析出blog.tanglu.me的IP 2.2.2.2 然后发送http请求为 ‘’域名blog.tang.lu IP2.2.2.2’,因为源站点没有配置blog.tang.lu这个站点 访问就会报错。但是CDN设置指定回源HOST为blog.tanglu.me,CDN设置回源请求就是 ‘IP是2.2.2.2 回源域名是 blog.tanglu.me’,这样就可以成功访问了
7. 备份和恢复
复制自blog.tanglu.me
7.1 备份
主控默认会每两小时备份数据库,备份默认保留7天(可以自行修改保留天数),备份文件在 /data/backup/cdn/
除了备份数据库,还需要备份 /opt/cdnfly/master/conf
文件夹下的 config.py
文件(其实记住AES_KEY和LOG_PWD就行了)
恢复时只需要用到这两个文件,为了防止主控失联,建议每天上传备份
7.2 恢复
旧主控:
将旧主控 /data/backup/cdn/
下的某个时间的数据库备份包 如 mysql-20230724-010931.sql.gz
下载到本地,重命名为 cdn.sql.gz
将旧主控的 /opt/cdnfly/master/conf/config.py
文件也下载下来
关闭旧主控,这里记得关闭,如果不关闭的话新旧主控同时运行会出现后台任务只创建但不执行,导致新主控无法正常运行
新主控:
首先正常执行安装主控命令:
如果有需要自授权请先搭建云端 修改hosts
curl -fsSL https://github.com/Steady-WJ/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
wget us.centos.bz/cdnfly/int_es.sh -O int_es.sh && chmod +x int_es.sh
./int_es.sh /home/es
supervisorctl -c /opt/cdnfly/master/conf/supervisord.conf restart all
#至此主控设置完成,通过旧主控的账号密码进入可以发现 节点 用户 网站 日志 dns等都恢复了
#接下来只需要对旧节点更换IP即可
旧节点:
需要将旧节点的旧主控IP替换为新主控的IP
#依次在ssh登录每个节点并执行下面命令即可
#将 your_new_ip 替换为你自己的新主控IP
wget -qO change_ip.sh https://file.1323123.xyz/cdnfly/backup/shell/change_ip.sh && chmod +x change_ip.sh && bash change_ip.sh your_new_ip
或选择手动操作
new_master_ip="这里替换为主控IP"
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
可以找到
参考
http://doc.cdnfly.cn/
https://hostloc.com/thread-1044609-1-1.html
https://github.com/Steady-WJ/cdnfly-kaixin
https://blog.tanglu.me/cdnfly