如何用 Cloudflare Workers 实现自动 DNS 故障转移?脚本实测教程

手里跑着几个重要业务,最怕的就是服务器突然挂了,或者在搞维护时流量断了。以前大家常用 Nginx 反向代理或者 Keepalived 做负载均衡和高可用,但这也意味着你需要额外搭建一台中转服务器,不仅费钱,维护成本也不低。

最近发现了一个基于 Cloudflare生态 的轻量级方案,利用 Cloudflare Workers 定时任务配合 DNS API,就能实现一套带健康监测和自动故障转移的 DNS 切换系统。关键是,这东西完全免费(在免费额度内),而且不需要额外的 VPS。

Cloudflare Workers architecture

Cloudflare Workers 全球边缘节点架构示意图

今天就来详细拆解一下这个脚本的原理和部署过程,手把手教你给业务加上一道“保险”。

一、核心功能拆解:它都能干什么?

这个脚本的核心逻辑其实很简单:定期检查 -> 发现故障 -> 切换 DNS -> 通知你。但它比普通的 Shell 脚本强在几个细节上:

  1. 自动化健康监测:脚本会定期向你的业务 IP 发送请求(比如 ping 或者 HTTP 请求),如果连续几次没响应,就判定为宕机。
  2. 自动 DNS 切换:一旦主 IP 宕机,脚本会自动调用 Cloudflare API,将域名的 A 记录修改为备用的 IP。当主 IP 恢复后,还可以自动切回来(视配置而定)。
  3. 多渠道通知:服务器挂了肯定得第一时间知道。脚本支持接入 Telegram、Bark 等通知渠道,发生切换时立马推送到手机。
  4. KV 存储:这是 Cloudflare Workers 的杀手锏。你可以把你的服务器 IP 列表、检测间隔等配置写在 KV 里,改配置不需要修改代码,直接在控制台更新 KV 即可,管理起来非常灵活。

二、为什么选 Cloudflare Workers?

很多人会问,为什么不用服务器上的 Cron 任务?或者 GitHub Actions?

  • 全球覆盖:Cloudflare 的边缘节点遍布全球,它能从离你用户最近的地方进行探测,比你自己的单台服务器监测更准确。
  • 无需维护基础设施:Workers 本身就是 Serverless 的,不用管系统升级、不担心监控脚本本身挂掉。
  • API 效率高:Cloudflare 操作自家 DNS 的速度非常快,通常几秒就能生效,比操作第三方域名商要快得多。

三、实战部署:从零开始搭建

Creating Cloudflare API Token

在 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 又不想折腾复杂架构的朋友来说,这绝对是一个值得放进工具箱的“瑞士军刀”。试着去搭一个吧,让业务跑得更安心!

标签: none

AI Skills Smart Station on Nick Launches

评论已关闭