CDN 付费、免费还是自建?用真实流量账单帮独立开发者选对
结论先行:独立开发者 99% 用 Cloudflare 免费 CDN(出口流量 $0、自带 DDoS)就够了;大文件/图片/视频放 Cloudflare R2(出口也免费)或便宜的对象存储;自建 CDN 基本没必要——只有当你月流量大到几百 TB、且内容是视频这种 Cloudflare 非企业版限制的类型,才考虑按量 CDN($0.002-0.005/GB)或自建。下面用真实账单讲为什么。
「独立开发者的选择题」第八题,关乎你的银行卡余额——带宽流量成本。在云计算商业模式中,计算与存储通常很透明,最致命的刺客永远是「公网出站流量(Egress Bandwidth)」。一个在 Hacker News 或 Reddit 爆火的小工具,如果没有 CDN 护体,一觉醒来可能为你带来数千美元的账单赤字。
先表态:我名下所有站点的静态前端、JS/CSS 脚本与公共图片,一律通过 Cloudflare 免费 CDN 分发;超过 5MB 的大体积静态资源和用户下载归档,统一存放于 Cloudflare R2 并绑定自定义域名。除开按月支付固定的 VPS 基础租金(如 Vultr 或 DigitalOcean),我从未为公网流量支付过一分钱弹性溢价。
0、写在前面:从 855 美元天价账单到服务条款封号
为什么独立开发者必须彻底算清 CDN 的账?看三个在技术社区广受关注的真实事件:
- Vercel 单月 855 美元账单事故:一位海外独立开发者上线了小型 Next.js 图片展示工具,项目突然被某家自动化抓取爬虫盯上。由于部署在 Vercel 默认环境且未在边缘配置强缓存,几天内被刷掉数 TB 带宽。Vercel 超额带宽单价高达 $0.40/GB,开发者收到账单时甚至无力偿还,险些导致信用卡被强制冻结。
- AWS CloudFront 被恶意刷量的惨剧:某团队使用 AWS S3 搭配 CloudFront 分发开源软件包,被黑客利用简单脚本并发死循环下载安装包。CloudFront 针对北美与欧洲区域的计费为 $0.085/GB,亚洲部分区域甚至达 $0.12/GB。短短一周累积 15TB 恶意流量,直接产生 $1,275 的无意义账单,且 AWS 官方工单最初拒绝免除。
- Cloudflare 服务条款(ToS 2.8)踩坑警告:有人听信了「Cloudflare 流量完全免费」的言论,自建了在线高清影视推流站,全部 MP4 切片直接走 Cloudflare 免费版橙云代理。一个月跑了 80TB 纯视频流,HTML 网页流量占比不足 1%。随后该账号收到 Cloudflare 官方合规团队通知:非企业版禁止将边缘网络作为纯视频/大文件流媒体的分发通道,必须在 48 小时内升级至数千美元的企业版(Enterprise)或关闭代理,否则全域封禁。
这些教训提炼出三条硬核准则:
- 公网按量计费的 CDN 是无限责任公司,在遭遇恶意爬虫或攻击时会化身碎钞机;
- Cloudflare 免费 CDN 对 HTML、CSS、JS、WebP/AVIF 等普通网站静态资源绝对友好且完全免费,但别试图白嫖海量视频流媒体;
- 源站(Origin)选址必须配合 CDN:若边缘 CDN 免费,但回源时从 AWS S3 扣除 $0.09/GB 出口费,省下的钱照样会在源站亏空。
1、期望目标:独立开发者的边缘网络三底线
- ✅ 成本确定性(Zero Surprise Bills):无论网站日常日活 100 还是瞬间被上百万人围观,带宽账单不会因此出现非线性暴增。
- ✅ 全球边缘响应(Edge TTFB < 50ms):静态文件在距离访问者最近的边缘 PoP 节点就近吐出,缓存命中率(Cache Hit Ratio)维持在 90% 以上。
- ✅ 源站隐身与减负(Origin Shielding):源站 VPS 只需应对动态 API 请求,95% 以上的静态并发压力在边缘消解,防止源站 CPU 与带宽被打死。
2、计划思考:真实带宽阶梯与成本核算表
我们把 100GB 到 100TB 的月度出站流量,代入 2026 年各主流云厂商与 CDN 的计费模型进行横向对比:
| 月度出站流量 | Cloudflare 免费 CDN | Cloudflare R2 自定义域名 | AWS CloudFront (北美均价) | BunnyCDN (标准层) | 自建 Nginx 缓存集群 (VPS) |
|---|---|---|---|---|---|
| 100 GB | $0.00 | $0.00 | $8.50 | $1.00 (最低消费 $1) | $5.00 (基础 VPS 包含) |
| 1 TB | $0.00 | $0.00 | $85.00 | $10.00 | $5.00 (普通 VPS 包含 1-2TB) |
| 10 TB | $0.00 | $0.00 (仅收存储费) | $850.00 | $80.00 - $100.00 | $20.00 (大带宽机房) |
| 50 TB | $0.00 (合规静态类) | $0.00 (出口无限制) | $3,500.00+ | $300.00 - $450.00 | $60.00 - $100.00 |
| 100 TB (视频流) | ⚠️ 会被 ToS 限制 | 适合存储 + 配合外部 CDN | $7,000.00+ | $500.00 (大客户议价) | $120.00 (Hetzner 等无限制机型) |
核心经济学结论:
- 普通网站与小应用(99% 独立开发者):Cloudflare 免费 CDN 是最优解,无需自建,也绝不应接入 AWS CloudFront 这种按量吞金兽。
- 大文件、图片与用户上传(UGC 场景):Cloudflare R2(存储仅 $0.015/GB/月,无出口流量费)+ 绑定自定义域名,彻底粉碎流量费陷阱。
- 纯视频流媒体与大下载站:若无法走 Cloudflare 免费层,推荐使用 BunnyCDN 按量计费;当月流量突破 100TB 且具备全职运维能力时,才值得采购 Hetzner 独立服务器自建 Nginx 缓存切片集群。
3、工程实操:生产级 CDN 与源站防护实战
实操 1:Cloudflare Cache Rules 现代化缓存规则实配
在 Cloudflare 控制台「Caching」→「Cache Rules」中创建一条高效的静态资源边缘捕获规则,避免无意义的动态回源:
规则匹配条件(Expression):
1 | (http.request.uri.path.extension in {"js" "css" "jpg" "jpeg" "png" "webp" "avif" "gif" "ico" "svg" "woff" "woff2" "ttf" "mp4"}) |
缓存动作设置(Cache Actions):
- Cache Eligibility:Eligible for cache(允许缓存)
- Edge TTL:Override origin →
30 days(边缘节点保留 30 天) - Browser TTL:Override origin →
7 days(浏览器本地保留 7 天) - Cache Key:
- Query String:Ignore query string(或根据静态版本号过滤)
- Ignore end-user device type
- Serving Stale Content:Enabled(启用
stale-while-revalidate,源站临时挂机或更新时先返回旧边缘副本)
实操 2:Cloudflare R2 自定义域名与响应头自动化
把大图与静态包存入 R2,并通过自定义二级域名分发(如 cdn.yourdomain.com)。
在管理后台配置自定义域名后,通过服务端上传或脚本写入标准 Cache-Control 标头:
1 | Cache-Control: public, max-age=604800, s-maxage=2592000, stale-while-revalidate=86400, immutable |
标头含义拆解:
public:允许浏览器与中继 CDN 节点随意缓存;max-age=604800:客户端浏览器本地缓存 7 天,7 天内重复访问不产生任何网络请求;s-maxage=2592000:Cloudflare 边缘共享缓存(Shared Cache)强制保留 30 天;stale-while-revalidate=86400:缓存过期后 24 小时内,边缘先立即响应旧数据给用户,后台异步回源静默更新;immutable:告诉现代浏览器该静态资源内容永不变更,无需在用户按 F5 刷新时发送 304 协商请求。
实操 3:Nginx 源站屏蔽与防穿透防御配置
当上了 CDN 后,最大的安全隐患是攻击者通过真实源站 IP 直接绕过 CDN 发起泛洪攻击,或者高并发爬虫直接打穿源站。
编写 /etc/nginx/conf.d/origin-shield.conf:
1 | # 1. 定义源站微缓存区,吸收突发穿透请求 |
配合 ittinker-scripts 开源库中的防火墙同步工具,可实现源站 UFW 与 Cloudflare 最新 IP 段的实时联动:
1 | # 自动拉取 Cloudflare 边缘 IP 并配置源站 UFW 白名单,彻底断绝源站真实 IP 扫描 |
针对整站的一键式性能与缓存基线布设,可结合 cloudflare-domain-baseline 仓库完成自动化下发:
1 | # 一键下发生产级 Brotli 压缩、HTTP/3 QUIC 与静态资源 Cache Rules |
4、运维排错:CDN 部署中的四项高危反常识
- 反常识 1:缓存未命中(Cache Miss)带来的隐形回源费:以为套了 Cloudflare 就高枕无忧,却把源站建在 AWS EC2 上。如果网站有大量随机参数查询(例如
?timestamp=1710000000),每次请求都会直接穿透边缘打到 EC2。由于 EC2 公网出站收费,月末依然收到大额账单。必须在 Cache Rules 中设置忽略无意义 Query String,并保证源站尽可能选择带大流量包的 VPS。 - 反常识 2:动态内容被意外长缓存导致数据串号:在 Nginx 层面给整个根路由无脑返回了
Cache-Control: public, max-age=3600。某位登录用户的个人信息页面直接被 Cloudflare 边缘缓存,后续所有匿名访问者看到的都是第一位用户的私人面板。包含用户登录态、Cookie 或 Authorization 的接口必须明确返回Cache-Control: private, no-store。 - 反常识 3:自建 CDN 的隐藏维护成本远超想象:许多人幻想买三台便宜海外 VPS 自建 Nginx 缓存当作全球 CDN。实际运转后发现:缺少 Anycast BGP,无法做就近路由;节点一旦当机没有自动健康旁路切流机制;SSL 证书需多机同步;遭遇 DDOS 时单台 VPS 几分钟被机房打进黑洞。除非有专业网络工程团队,个人切勿尝试裸自建 CDN。
- 反常识 4:Purge 刷新延迟与客户端顽固缓存:向 Cloudflare 下发 Purge Everywhere 仅能清空边缘节点的副本。如果此前响应头给用户的浏览器设置了一年的
max-age,老用户在本地缓存未过期之前根本不会重新向网络发包,导致发布新版本后出现大量前端脚本与样式错位。静态资源在打包时必须引入哈希文件名(如app.3a8fbc.js),而非依赖 URL 路径刷新。
5、决策矩阵:CDN 选型路线指南
| 业务形态 | 推荐基础设施方案 | 出口流量开销 | 核心选型逻辑 |
|---|---|---|---|
| 个人博客 / 开源文档 | Cloudflare 免费 CDN | $0 | 零成本跑满边缘,开箱即用防御恶意爬虫 |
| SaaS 前端 + API | Cloudflare 代理 + VPS 源站 | $0 (静态零元) | 边缘缓存前端静态,动态接口通过灰云或纯穿透直达 |
| 图片图床 / 大归档下载 | Cloudflare R2 + 自定义域名 | $0 (出口免费) | 摆脱传统 S3 的出口计费陷阱,仅按实际存储空间付费 |
| 高并发短视频 / 流媒体 | BunnyCDN 或 KeyCDN | $0.005 - $0.01 / GB | 合规绕过 Cloudflare ToS 限制,按量单价极低且无最低消费 |
| 超大规模视频平台 (>200TB) | 多节点高性能 VPS + 自建 Nginx | 固定机架网络费 | 在特定业务规模下,固定带宽月租远低于公有云按量扣款 |
6、高频 FAQ
Q:Cloudflare 免费 CDN 对国内访问速度如何?会变慢吗?
A:Cloudflare 免费版的 Anycast 节点主要位于海外(美西、香港、新加坡、欧洲等)。对于面向海外出海业务的独立开发者,全球各地响应都在 10-30ms 之间,体验极佳;对于纯国内受众,由于部分节点受国际骨干网波动影响,晚高峰可能存在丢包延迟。若主力用户在国内,静态资源可考虑国内合规云服务商,出海项目则首推 Cloudflare。
Q:为什么我开启了 Cloudflare 代理,后台显示的缓存命中率却只有 20%?
A:默认状态下,Cloudflare 仅依据文件后缀判定是否缓存,且完全遵循源站返回的 HTTP 标头。如果源站 Web 框架(如 Rails、Django、Next.js)默认给所有输出添加了 Cache-Control: private 或 Set-Cookie,Cloudflare 绝不会主动执行边缘暂存。必须前往 Cache Rules 明确设定针对静态目录的覆写策略。
Q:Cloudflare R2 和 AWS S3 的主要差异是什么?为什么能做到零出口费?
A:R2 在协议层完全兼容 AWS S3 的 API 规范,现有的 S3 客户端工具或 SDK 无需修改即可直接换用。Cloudflare 作为全球最大的带宽中继提供商之一,自身具备庞大的光纤骨干网互联资源,因此选择将出口流量免费作为核心差异化优势,仅对底层存储空间($0.015/GB/月)和 A/B 类请求调用次数计费。
Q:如果有人恶意持续循环下载我 CDN 上的几百兆静态包,我会被扣费吗?
A:在 Cloudflare 免费 CDN 与 R2 自定义域名体系下,完全不会产生任何出站带宽账单。面对极端的耗尽型攻击,Cloudflare 的底层速率限制器(Rate Limiting)和 Bot Management 机制会在边缘自动触发人机验证拦截,源站甚至感知不到恶意请求的存在。
延伸阅读:云厂商天价账单避坑详见 D02 选型决策;DNS 权威解析加速见 D07 选型决策;Cloudflare 免费功能完整手册参考 /posts/cloudflare免费功能速查/;全站 SSL 与边缘优化参阅 /posts/cloudflare加速配置实战/;出海基础设施推荐配合 Cloudflare 与 Vultr 组合使用。