首页 时政热点 科技头条 智能AI 安全攻防 数码硬件 开发者生态 归档 标签 关于

可编写脚本的 GeoDNS:离开 AWS 转向 Bunny

摘要

Scriptable GeoDNS: leaving AWS for Bunny Vincent Bernat November 6, 2026 To op­ti­mize the per­for­mance met­rics of this blog, I re­lied on Ama­zon CloudFront to serve the as­sets, 1 and Route 53 for...

the per for ing Bunny net and DNS con month
2026-11-07 1 阅读 约8分钟阅读 sshah03
分享:
字号:
可编写脚本的 GeoDNS:离开 AWS 投奔 Bunny Vincent Bernat 2026 年 11 月 6 日 为了优化此博客的性能指标,我依靠 Amazon CloudFront 来提供资产 1 和用于地理感知 DNS 2 的 Route 53,以将读者引导至提供内容的最近的主机。但 Route 53 价格昂贵:每个区域每月 0.50 美元,每百万次地理定位查询 0.70 美元,每月每次运行状况检查 0.75 美元,再加上使用 DNSSEC 签署区域所需的 KMS 密钥每月 1 美元。当我发现 Bunny DNS 对于多达 500 个域几乎免费,并且具有可编写脚本的答案时,我就开始行动了!另外,它是一家总部位于斯洛文尼亚的欧洲公司。 2 Route 53 自 2021 年 12 月起为 bernat.ch 提供服务。我没有使用健康检查,因为它们太贵了。我也没有在那里托管我的大部分区域,作为对 haproxy 的查询。德班。仅网络一项就花费我每月约 10 美元。 ❦ Bunny CDN Bunny.net 于 2015 年开始名为 BunnyCDN。他们于 2017 年添加了 IPv6 支持。切换很顺利。我不带自定义域:我提供来自 b-cdn 的内容。 .net 域。由于我依靠内容协商来提供 AVIF 和 WebP 图像,因此我将 CDN 配置为单独缓存每种图像格式。我禁用日志记录以避免收集个人信息。虽然 bunny.net GDPR 页面承诺他们会对数据进行匿名处理,但尚不清楚在禁用日志记录时 CloudFront 在自己的日志中保留什么内容。 bunny.net CDN 产品的唯一缺点是缺乏 HTTP/3。我询问他们的支持:两分钟后,他们回答说他们正在处理这个问题,但没有预计到达时间可以分享。 Bunny DNS Bunny.net 于 2022 年推出了 DNS 产品,最近将其成本降至几乎为零。它们支持地理路由,但一个非常酷的功能是可编写脚本的 DNS:它在每个查询上运行一段用户提供的 JavaScript 来计算答案。我在世界各地运行七台小型 NixOS 虚拟机来托管此博客:巴黎、纽伦堡、阿什本、新加坡、圣何塞、圣保罗和悉尼。 Bunny 的可编写脚本的 DNS 让我返回两个最近的服务器的 IP 地址。如果第一台服务器出现故障,浏览器将回退到第二台服务器。 const 服务器 = [ { ipv4 : "45.90.160.60" , ipv6 : "2a0c:8881:5:100::1" , 纬度 : 48.88 , 经度 : 2.22 , }, /* […] */ { ipv4 : "139.180.162.114" , ipv6 : "2001:19f0:5800:1855:5400:6ff:fef0:4c0a" , 纬度 : - 33.87 , 经度 : 151.21 , }, ]; const family = { A : "ipv4" , AAAA : "ipv6" }; const 记录 = { A : ARecord , AAAA : AaaaRecord };导出默认函数handleQuery(query){const type = String(query.request.queryType)。到大写(); const family = family [ 类型 ]; if (!family) return []; // 获取用户位置 const location = query .要求 。地理位置; // 构建候选者列表 let Candidates =servers . map ( ( s ) => new Server ( s [ family ], s . 纬度 , s . 经度 , 100 ), ); // 选择两个最近的活动服务器 const selected = []; while (selected.length < 2) { const server = RoutingEngine。 getClosestServer ( 候选人 , 位置 , true );选定的。推送(服务器);候选人=候选人。过滤器 (( s ) => s . ip !== server . ip ); } // 返回其 IP 地址 return selected . map (( s ) => 新记录 [ type ]( s . ip , 3600 ));上面的脚本依赖于RoutingEngine。 getClosestServer() 帮助器,它将最近的活动服务器返回给用户。 4 感谢 Doggo ,我们可以检查它是否按预期工作,至少对于 A 来说: 5 $doggo --gp-from = "Amsterdam" A vincent.bernat.ch 位置名称类型 TTL 地址阿姆斯特丹,NL vincent.bernat.ch。 3600s 45.90.160.60 vincent.bernat.ch。 A 3600s 116.203.18.48 $doggo --gp-from = "Texas" A vincent.bernat.ch 位置名称类型 TTL 地址 美国休斯顿(德克萨斯州) vincent.bernat.ch。 3600s 5.161.44.145 vincent.bernat.ch。 A 3600s 149.28.219.155 3 我曾向bunny.net询问“活着”是什么意思,但他们拒绝透露所用的方法。这有点不幸,因为他们的文档描述了智能记录的健康监控方法。 ❦ 4 用户通过解析器查询Bunny DNS。通常,解析器要么靠近用户,要么通过 EDNS 客户端子网公开用户的子网。 ❦ 5 不要按原样使用此脚本:RoutingEngine。 getClosestServer() 仅适用于 IPv4。最终的脚本解决了这个限制。 ❦ 此方法最烦人的缺点是来自布宜诺斯艾利斯的用户同时获得圣保罗(1000 英里,30 毫秒 RTT)和阿什本(5200 英里,140 毫秒 RTT)。大多数解析器会随机化顺序,因此用户可以从 Ashburn 提取网页。我们可以只返回最近的服务器,并用内置的地理路由交换脚本记录。但如果服务器不可用,浏览器就别无选择,直到 DNS 缓存过期。即使 TTL 很短,它也会留下很短的不可用窗口。
这篇文章对您有帮助吗?

订阅66必读

每日精选科技资讯,直达你的邮箱