本文仅作思路分享,具体实现因业务架构而异

部署好的实例:https://sre.liteyuki.icu

最近在配置uptimeflare时遇到了问题,这玩意是部署在Cloudflare的,我们的cdn是在国内的,Cloudflare请求cdn服务有概率返回错误,实际上服务是在正常运行的,而且同一个服务走Cloudflare代理是正常的。所以想用Cloudflare线路来请求我们的站点。

建立代理线路

你可以尝试为所有解析到国内cdn的业务额外添加一个启用Cloudflare代理的CNAME记录,但是那样太没有必要且不优雅,会在后端增加一些配置项,因此不推荐。

添加一个子域名解析到我们的源服务器,启用代理(小云朵),假设这个记录为:proxy.example.com。

在此之后,所有的没有命中缓存的请求都会到达我们的源服务器。

配置自定义Host字段

在一些场景中http请求中,由于RFC 7230规范,Host是不能被设定的,由请求库,浏览器等在发送时计算,这也是后端SNI分流所用的字段。所以修改uptimeflare源码是不太现实的,它运行在serverless的环境。不过可以在发送请求时添加一个自定义请求头,例如X-My-Host,塞入实际的主机名。uptimeflare配置支持自定义头部。

Nginx回环大法

由于Nginx无法在请求到达后修改Host进行分流。不过没有什么事情是加一层中间层不能解决的,如果有,那就再加一层,于是我们可以再部署一个nginx来解决问题,但是没必要,直接在同一个nginx上进行回环请求。在请求从Cloudflare边缘节点到达源服务器后,将X-My-Host设置为Host,然后继续proxy_pass给自身,由后续的SNI进行分流。如果X-My-Host不存在,丢一个400错误码给客户端即可,以防死循环(不过不用太担心)。

后续

uptimeflare已经部署好了,且在Cloudflare代理线路下监测状态一切正常。