流量暴涨把 Cloudflare Worker 打满后:我用 Rust 在 OCI 上重建了视频流代理

45 阅读4分钟

流量暴涨把 Cloudflare Worker 打满后:我用 Rust 在 OCI 上重建了视频流代理

入口: star.divinations.top/
开源仓库: github.com/nianyi778/r…

这篇文章记录一次“事故驱动”的工程改造:用户流量突然暴涨,Cloudflare free 版本的 Worker 很快被打满。我第一时间充钱,想顶住峰值,紧接着就收到了限制/封禁通知。

那一刻我意识到:当你的核心链路依赖一个平台的边缘函数额度与策略时,可用性并不完全掌握在自己手里。
于是我马上启动 Rust 改造,把播放器最关键的“视频流代理”迁移到自建服务上,最终落地到 Oracle Cloud(OCI)服务器,保证可控、可部署、可长期稳定运行。

1. 这个问题为什么棘手(不是 “curl 一下就完事”)

视频流代理的难点在于它不是普通 HTTP 反代:

  • HLS(m3u8)是“清单 + 分片 + Key”的链路
    只代理 m3u8 没意义:播放器会继续请求清单里的 ts/m4s/key URL,如果不重写,它们会绕过代理。
  • MP4 等大文件需要 Range(206 Partial Content)
    不透传 Range,拖拽、断点续传会非常不稳定。
  • 流量大、连接长、响应体大
    平台边缘函数对这类流式转发更敏感:额度/时长/策略/风控都可能触发。

所以我做的不是“一个反代”,而是一条“播放器真实链路可用”的代理链路。

2. 设计目标:动态上游 + 播放器友好

我把需求收敛成两条:

  1. 上游是动态的:每次请求的域名/端口都可能不同
  2. 对播放器友好:HLS 清单重写 + Range 透传 + 流式转发

最终服务暴露的接口非常简单:

  • /stream?url=...(主接口)
  • /api/proxy/stream?url=...(兼容旧系统)
  • /health(健康检查)

3. 核心能力拆解(为什么这套能跑得稳)

3.1 m3u8 重写:让分片和 KEY 也继续走代理

当上游返回 m3u8(或 URL 包含 .m3u8),服务会读取清单文本并重写:

  • 非注释行(分片/子清单 URL)→ 重写成 https://你的域名/api/proxy/stream?url=...
  • #EXT-X-KEY:...URI="..." → 把 key 的 URI 也重写成代理 URL

这一步是 HLS “能播”的关键,否则 m3u8 只是个入口,真正的数据流还是直连源站。

3.2 Range 透传:拖拽/续传的基础

Range 请求头会被透传给上游,源站支持 Range 时就能返回 206,播放器拖拽更稳定。

3.3 流式转发:不落盘、不全量缓冲

代理不把视频读进内存,也不落盘:上游响应体以流式方式直接转发给客户端,减少延迟和内存压力。

4. 工程化落地:OCI + Nginx(443) + systemd

部署形态:

  • Rust 服务部署在 Oracle Cloud(OCI)Linux 服务器
  • systemd 常驻运行(崩溃自动拉起)
  • Nginx 监听 443(HTTPS 对外),把特定路径反代到本机 8080

Nginx 关键点是必须传:

  • X-Forwarded-Proto
  • X-Forwarded-Host

否则 m3u8 重写出来的 URL 可能协议/域名错误(例如变成 http)。

5. CI/CD:让它可交付、可开源、可复现

我把“写完能跑”升级到“可交付”:

  • CI:每次 push/PR 自动跑 fmt/clippy/test/build
  • 自动版本管理:release-plz 自动开 Release PR,合并后自动打版本 + 创建 GitHub Release
  • Release 附件提供 Linux 可执行文件,并带 sha256 校验

architecture.png

5.1 为什么要 musl 静态二进制

真实踩坑:在较老 Ubuntu 上,glibc 版本可能不够,导致:

GLIBC_2.34 not found

所以发布改成 x86_64-unknown-linux-musl 静态链接,兼容性更好:下载解压就能跑

(CI/CD 说明见仓库文档:cicd.md)

6. 适用范围 & 风险提示

适用范围:

  • HLS(m3u8/ts/m4s)代理
  • MP4 等 Range 场景
  • 上游域名/端口不固定(动态源站)
  • 想把可用性从平台配额/策略中“赎回”到自己手里

风险提示:

  • 这是“动态上游代理”,天然有 Open Proxy/SSRF 风险
    对外开放建议加鉴权、限流、白名单(本仓库当前只做风险提示)。

7. 结语

这次改造最大的收获不是“Rust 很快”,而是:
把不可控的风险(平台策略/额度/风控)换成可控的成本(服务器与运维)。

入口: star.divinations.top/
开源仓库: github.com/nianyi778/r…

banner.png

如果你也在做播放器、媒体聚合、跨域代理,欢迎提 Issue 或 PR,我们一起把它做得更稳、更工程化。