如何用 Cloudflare Workers 实现自动 DNS 故障转移?脚本实测教程
如何用 Cloudflare Workers 实现自动 DNS 故障转移?脚本实测教程
手里跑着几个重要业务,最怕的就是服务器突然挂了,或者在搞维护时流量断了。以前大家常用 Nginx 反向代理或者 Keepalived 做负载均衡和高可用,但这也意味着你需要额外搭建一台中转服务器,不仅费钱,维护成本也不低。
最近发现了一个基于 Cloudflare生态 的轻量级方案,利用 Cloudflare Workers 定时任务配合 DNS API,就能实现一套带健康监测和自动故障转移的 DNS 切换系统。关键是,这东西完全免费(在免费额度内),而且不需要额外的 VPS。
Cloudflare Workers 全球边缘节点架构示意图
今天就来详细拆解一下这个脚本的原理和部署过程,手把手教你给业务加上一道“保险”。
一、核心功能拆解:它都能干什么?
这个脚本的核心逻辑其实很简单:定期检查 -> 发现故障 -> 切换 DNS -> 通知你。但它比普通的 Shell 脚本强在几个细节上:
- 自动化健康监测:脚本会定期向你的业务 IP 发送请求(比如 ping 或者 HTTP 请求),如果连续几次没响应,就判定为宕机。
- 自动 DNS 切换:一旦主 IP 宕机,脚本会自动调用 Cloudflare API,将域名的 A 记录修改为备用的 IP。当主 IP 恢复后,还可以自动切回来(视配置而定)。
- 多渠道通知:服务器挂了肯定得第一时间知道。脚本支持接入 Telegram、Bark 等通知渠道,发生切换时立马推送到手机。
- KV 存储:这是 Cloudflare Workers 的杀手锏。你可以把你的服务器 IP 列表、检测间隔等配置写在 KV 里,改配置不需要修改代码,直接在控制台更新 KV 即可,管理起来非常灵活。
二、为什么选 Cloudflare Workers?
很多人会问,为什么不用服务器上的 Cron 任务?或者 GitHub Actions?
- 全球覆盖:Cloudflare 的边缘节点遍布全球,它能从离你用户最近的地方进行探测,比你自己的单台服务器监测更准确。
- 无需维护基础设施:Workers 本身就是 Serverless 的,不用管系统升级、不担心监控脚本本身挂掉。
- API 效率高:Cloudflare 操作自家 DNS 的速度非常快,通常几秒就能生效,比操作第三方域名商要快得多。
三、实战部署:从零开始搭建
在 Cloudflare 后台创建 API Token
下面直接上干货,看看怎么把这玩意儿跑起来。
1. 准备工作
在开始之前,你需要手头有这几样东西:
- 一个 Cloudflare 账号,并且已经把域名 DNS 解析托管到了 Cloudflare。
- 一台主服务器(IP A)和一台备用服务器(IP B)。
- 下载好脚本代码(文末相关资源请查看原贴获取)。
2. 获取 API Token
别直接用 Global API Key,那个权限太大,不安全。建议去 Cloudflare 后台创建一个专属 Token:
- 权限选择
Zone-DNS-Edit。 - 资源选择你需要操作的特定域名。
- 复制生成的 Token,待会儿要用。
3. 配置 KV Namespace
为了让脚本灵活运行,我们需要创建一个 KV 命名空间来存储配置:
- 在 Workers & Pages 页面找到 "KV",创建一个新的 Namespace,比如叫
DNS_SWITCH_CONFIG。 - 在这个 KV 里创建一个 Key,比如叫
config,Value 填写你的配置 JSON。内容大致包括主 IP、备 IP、域名、检测端口、通知 API Key 等。
4. 编写并上传 Worker
- 新建一个 Worker,将脚本代码粘贴进去。
- 在代码开头填入你的 Account ID、 Zone ID 和刚才获取的 API Token。
- 绑定 KV:在 Worker 的设置 -> Variables -> KV Namespace Bindings 中,把刚才创建的 KV 绑定到一个变量名(比如
CONFIG),确保代码里调用这个变量名来读取配置。
5. 设置触发器
这是让它动起来的关键:
- 切换到 "Triggers" 标签页。
- 添加 "Cron Triggers"。
- 输入时间表达式,比如
*/5 * * * *表示每 5 分钟执行一次检查。
保存并部署,大功告成!
四、常见问题与优化建议
在实际使用中,我整理了几个可能会遇到的坑和优化思路:
Q1:检测频率怎么设置? 太频繁会消耗额度,太慢反应不灵敏。如果是个人博客,10 分钟一次没问题;如果是电商或 API 业务,建议 2-5 分钟一次。免费版 Worker 每天有 10 万次请求额度,一般来说足够用了。
Q2:如何避免误判? 有时候网络抖动会导致单次检测失败。建议在脚本逻辑里加入“重试机制”,比如连续 3 次检测失败才判定为宕机并进行切换,恢复的时候也同理,这样能防止频繁切换 DNS 导致的解析延迟。
Q3:通知渠道发不出去怎么办? 目前脚本的 Telegram 通知部分在国内网络环境下可能不太稳定。如果你的服务器在海外,建议配合一个代理服务来发通知;或者直接使用 Bark 这种针对 iOS 的推送服务,延迟更低也更稳定。
Q4:支持 HTTPS 监测吗?
支持。在 KV 配置里,可以将检测协议设置为 HTTPS,并指定具体的 URL 路径(例如 /health),这样可以检测到 Web 服务是否真的卡死,而不仅仅是 IP 通不通。
总结
这个 Cloudflare DNS 自动切换脚本,虽然代码量不大,但解决了一个非常实际的问题:低成本的高可用。它不需要你精通复杂的负载均衡配置,只要会改 JSON,懂一点 JS,就能享受企业级的高可用服务。
对于手里有多台廉价 VPS 又不想折腾复杂架构的朋友来说,这绝对是一个值得放进工具箱的“瑞士军刀”。试着去搭一个吧,让业务跑得更安心!

评论已关闭