流量暴涨把 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. 设计目标:动态上游 + 播放器友好
我把需求收敛成两条:
- 上游是动态的:每次请求的域名/端口都可能不同
- 对播放器友好: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-ProtoX-Forwarded-Host
否则 m3u8 重写出来的 URL 可能协议/域名错误(例如变成 http)。
5. CI/CD:让它可交付、可开源、可复现
我把“写完能跑”升级到“可交付”:
- CI:每次 push/PR 自动跑
fmt/clippy/test/build - 自动版本管理:release-plz 自动开 Release PR,合并后自动打版本 + 创建 GitHub Release
- Release 附件提供 Linux 可执行文件,并带 sha256 校验
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…
如果你也在做播放器、媒体聚合、跨域代理,欢迎提 Issue 或 PR,我们一起把它做得更稳、更工程化。