一种固定 cloudflare workers 出口 ip 所属地的方法!
发布于: 2025-7-30
最后更新: 2025-7-29
type
status
date
slug
summary
tags
category
icon
Video preview

workers应用程序的问题?

众所周知,cloudflare workers 是边缘节点,当你部署了一个 worker 以后,会在物理上靠近客户端请求的数据中心提供服务。假如你的 worker 是直接响应用户请求,不需要再请求第三方,那么这种模式会给用户带来最好的用户体验,但现实往往不尽如人意,无论什么应用程序,都很难避免需要请求第三方API。
而 workers 请求第三方API,是不能指定出口的,出口IP由 cloudflare 内部网络决定,请求有可能从亚洲发起,也有可能从欧洲发起。但是第三方API很可能会限制客户端IP的归属地,禁止部分区域的请求,假设网站A是一个日本的网站,只接受来自日本的IP的请求,那么你部署的这个worker去请求网站A的API的时候,从欧洲发起请求就会被拒绝,只有正好从亚洲的日本发起请求时才能成功。

cloudflare 提供的另外一个产品:Durable Objects

cloudflare 官方当然也意识到了 worker 的局限,因此它们也提供了另外一个产品:Durable Objects(持久对象)。
按官方开发者的说法,Durable Objects 是构建有状态无服务应用的基础(stateful serverless application)。
这里有一期关于 Durable Objects 的播客,很有意思,感兴趣的推荐大家好好看一看
Video preview

与worker的关系

Durable Objects 是一种特殊的 worker,它是一种将计算和存储绑定到一起的一个抽象概念,每一个DO被创建以后,都会带有一个本地存储,并且DO被创建以后,就会固定在某个区域,来自全球范围内的请求都会被路由到这一个 Durable Objects 之中。

省流版图示

我也画了张图来描述了一下 Durable Objects 的过程,省流观看
notion image

如何计费?

当然,对于大家来说,可能最关心的还是能不能白嫖,在官方文档中明确说了有 free plan,由于 Durable Objects 在使用时实际上是依赖的 worker 以及 sqlite 数据库(free plan 只支持 sqlite),因此免费额度实际上受限于 worker 的请求次数以及 sqlite 的读写次数。
对于 worker 大家都很熟悉,每天十万次请求,Durable Objects 的请求都是由 worker 转发,因此两者的请求额度相当于共享,也是十万次。
而 sqlite 数据这里,我目前也不是很确定,官方文档给出的是每天五百万次 Rows reads,十万次 Rows written,以及 5GB 的空间;我这里比较疑惑的是 Durable Objects 的 sqlite 的免费额度是否会和 D1 的免费额度共享,还是说 Durable Objects 的 sqlite 免费额度单独计算?我会有这个疑问是因为开发者在播客中说过,Durable Objects 的 sqlite 和 D1 实际上是两个不同的产品,在这里我就保险估计,这两个产品的免费额度共享。

一个简单的使用案例

这个案例参考来源于:UptimeFlare,这是一个很棒的开源监控工具,推荐使用。这款工具中实现了检测网站可用性的功能,博主为了了解 Durable Objects 的使用,就将其提取出来,实现了一个简单的从全球地区检测网站可用性的页面。
我的GitHub仓库:Global-Ping
项目的功能很简单,你提交一个地址,然后 worker 接受到请求以后,会通过全球范围内多个区域的 Durable Objects 发起请求,获取响应时间以后展示到网页上。
默认展示页面:
notion image
结果展示:
notion image

写在最后

Durable Objects 最显著的用途就是作为代理,包括官方开发者也是这么说的,有些请求只有在特定地区发起才有意义。因此我在这里介绍了一种可以获得 cloudflare 全球 ip 并且固定区域的方式,现在还没有直接可用的脚本,或许以后会出现吧
 
hello-world为什么你搭建 cf workers 无法访问推特(X)?
Loading...