用 Bunny 的可脚本 DNS 做就近接入:比 Route 53 便宜,坑也不少
来源:vincent.bernat.ch — 2026-11
📋 概述
Vincent Bernat 把博客的 CDN 与 DNS 从 CloudFront 加 Route 53 迁到 bunny.net。Route 53 的账单很具体:每 zone 每月 0.5 美元、每百万次地理位置查询 0.7 美元、每个健康检查每月 0.75 美元,再加 DNSSEC 签名所需 KMS 密钥的每月 1 美元;而 Bunny DNS 对 500 个域名以内几乎免费,还提供「可脚本 DNS」——每次查询都跑一段用户提供的 JavaScript 来算答案。他用七台 NixOS 虚拟机分布在巴黎、纽伦堡、Ashburn、新加坡、圣何塞、圣保罗与悉尼,脚本按查询来源的地理位置返回最近两台服务器的 A/AAAA,浏览器能在第一台挂掉时回退到第二台。麻烦出在解析器会打乱记录顺序,于是布宜诺斯艾利斯的用户可能被分到 5200 英里外、延迟 140ms 的 Ashburn。他试过 RFC 9460 的 HTTPS 记录靠优先级串起「最近→次近→兜底」,但 Chrome 忽略 target 不是「.」的记录,而且 Bunny 不像 CNAME 那样在附加段附上目标地址,解析器得多跑一轮。最后退回混合策略:两台距离相近就都返回、TTL 一小时;差距超过两倍且超过 1000 英里就只给最近一台、TTL 两分钟。
🔑 核心要点
- Route 53 的隐性成本很硬:地理位置查询每百万 0.7 美元、每个健康检查每月 0.75 美元,还要为 DNSSEC 的 KMS 密钥每月付 1 美元。
- Bunny 的可脚本 DNS 允许每次查询跑一段 JavaScript,用 RoutingEngine.getClosestServer() 挑出最近的两台机器。
- 只返回两台带来新问题:多数解析器会打乱顺序,有人可能从 5200 英里外、延迟 140ms 的节点取页面。
- HTTPS 记录(RFC 9460)本可按优先级串起「最近→次近→兜底」,但 Chrome 忽略 target 不是「.」的记录。
- 而且 Bunny DNS 不像 CNAME 那样在附加段返回 first.geo 的地址,解析器必须多花一轮查询。
- 最终方案是混合:距离相近返回两台、TTL 一小时;差距超过两倍且超过 1000 英里就只给最近一台、TTL 两分钟。
💡 金句
最烦人的一点是,从布宜诺斯艾利斯来的用户会同时拿到圣保罗(1000 英里、30ms RTT)和 Ashburn(5200 英里、140ms RTT),而大多数解析器会把顺序打乱。
👍 0
👎 0
← 返回 Lobsters 首页