Vercel CDN 直送 FastAPI 静态文件:Function 用量怎么降

Vercel CDN 现在可直接分发符合条件的 FastAPI 前端与静态文件,避免触发 Function 调用和相关计算用量。本文拆解路由顺序、中间件与依赖项形成的安全边界,说明 Pro、Hobby 账单中哪些指标会下降、哪些 CDN 成本仍然存在,并给出上线后的部署核验清单。

Sunday, September 13, 2026Omid Saffari
Tools
Vercel CDN 直送 FastAPI 静态文件:Function 用量怎么降

Vercel 于 2026 年 9 月 10 日调整了 FastAPI 应用的一项成本。符合条件的前端与静态文件请求现在会由 Vercel CDN 直接送达访客,不再产生 Function 调用和计算资源用量。CDN 请求与流量传输依然存在,因此这项变化降低的是 Function 用量,并不意味着静态内容可以免费分发。

Vercel CDN 直送后,请求不再进入 Function

静态文件是服务器可以原样返回的内容,例如 HTML 文件、样式表、JavaScript 打包产物、字体或图片。Vercel Function 则是处理动态请求的 FastAPI 运行进程。CDN 是靠近访客的分发层。

在这次调整前,通过 FastAPI 挂载的文件仍可能经过 Function。请求先到达 Vercel 网络,再调用 FastAPI Function,最后由 Python 返回文件。

现在,Vercel 会在构建期间识别 app.frontend() 和 FastAPI StaticFiles 后面符合条件的文件,将它们提升到 CDN;匹配的请求随后可在不调用 Function 的情况下得到响应

请求路径由此从:

visitor → CDN → FastAPI Function → file → visitor

变为:

visitor → CDN file → visitor

动态 API 并不会因此变成静态资源,改变路径的只有匹配的文件。项目级 public/ 目录中的文件原本就由 CDN 分发,因此已经把所有公开资源放在该目录的应用不会从此次发布中获得新的节省。

默认情况下,提升到 CDN 的目录也会继续留在 Function 部署包中。设置 tool.vercel.fastapi.static.exclude = true 可以移除这份重复副本,但那是另一项部署包取舍;CDN 请求路径无需依赖该设置即可生效。

一张架构剖面图:公开的 FastAPI 资源从访客经 CDN 走短路径,受保护资源则经过 Function 及其访问检查
公开资源可以止步于 CDN;需要由 FastAPI 检查请求时,受保护资源仍须经过 Function。

账单减少的是计算用量,不是分发用量

Vercel 会分层计量请求。Function Invocations 统计进入代码的请求;Active CPU 和 Provisioned Memory 衡量这些调用消耗的计算与运行时资源;Fast Origin Transfer 衡量 CDN 与 Function 之间的流量。

外层分发使用另一组计量项。控制台中显示为 Edge Requests 的 CDN Requests 同时适用于静态资源和 Function 流量;Fast Data Transfer 则统计 CDN 发往访客的字节数。

假设有 100 万次完全相同的资源请求:部署前它们都会进入 Function,部署后也都符合提升条件,那么账目变化如下:

计量项提升前提升后
Function Invocations1 million0
这些请求的 Active CPU按实际用量计0
这些请求的 Provisioned Memory按实际用量计0
这些响应的 Fast Origin Transfer按实际用量计0
CDN Requests 或 Edge Requests1 million1 million
发往访客的 Fast Data Transfer按实际字节数计按实际字节数计

Pro 的公开价格是每 100 万次 Function 调用 $0.60。因此,在扣除月度抵扣额度前,原本进入 Function 的 100 万次文件请求可减少 $0.60 的调用用量费用;此外,还会减少这些请求实际产生的 Active CPU、Provisioned Memory 和 Fast Origin Transfer。

后面这部分必须以自己的 Usage 数据为准。若文件响应几乎不占用 Python,能省下的 CPU 就很少;响应较大时,可减少的源站传输可能更多。这次发布提供的是一条新路径,不是一个适用于所有应用的节省比例。

账本另一边的 CDN 用量依然存在。Vercel 当前的 CDN 价格页面显示,在按需计费模式下,Pro 包含前 1000 万次 Edge Requests 和前 1 TB Fast Data Transfer,超出后按地区费率计费。使用 Flat Rate CDN 的团队则会消耗该套餐的请求与传输容量。Flat Rate CDN 解读讨论的是另一项预算选择。

对 Hobby 用户来说,收益可能体现为更多余量,而非更低的现金账单。Hobby 包含一百万次 Function 调用、四小时 Active CPU,以及 360 GB-hours Provisioned Memory。公开文件不再进入 Function 后,就不会继续消耗这些额度;但其 CDN 分发仍会在适用时计入用量。

是否适用,取决于路由与安全规则

对于 StaticFiles,Vercel 会保留 FastAPI 的声明顺序。如果某条路由在静态挂载点之前声明,那么遇到相同路径时,它会优先匹配并进入 Function;若路由在挂载点之后声明,则会输给 CDN 文件。

app.frontend() 的规则略有不同。无论声明顺序如何,API 路由始终优先于前端文件,因此挂载在 / 的前端不会吞掉真正的 API 端点。

安全要求也会改变默认行为。CDN 文件不会进入 Python,因此 FastAPI 中间件和 Depends() 检查都无法在其上运行。基于这个原因,Vercel 默认让以下路径继续经过 Function:

  • 应用存在顶层中间件时,所有静态挂载点和前端。
  • 子应用存在中间件时,该子应用的静态挂载点。
  • 由 FastAPI 依赖项保护的前端。

设置 cdn = false 则选择相反的取舍:关闭提升,让所有匹配请求继续经过 Function。如果应用代码必须检查每个请求,这是合理选择。

还有一个较小的边界情况:访问 StaticFiles 挂载点的裸根路径时,请求仍会进入 Function,以便 FastAPI 将其重定向到带尾部斜杠的形式。如果客户端持续请求这一路径,就不要期待 Function 用量绝对归零。

这项变化会怎样影响实际工作

单仓库 FastAPI SaaS 的独立开发者

如果独立开发者通过 app.frontend() 分发打包后的 Web 应用,可以让 API 保持动态,同时把公开 HTML、CSS 和 JavaScript 流量移出 Function 路径。直接收益是计算用量基线更干净:产品流量增长时,不会再把浏览器的每次资源获取都算成后端工作。

同时管理公开文件与客户专属文件的服务商工程师

服务商工程师可以把公开外壳放到 CDN,同时在静态挂载点之前声明敏感路由。收益不只在于降低 Function 用量,还在于得到一张更清晰的路由图:哪些客户文件需要 Python 作出访问决策,哪些不需要,一目了然。

与财务协作的后端负责人

后端负责人可以向财务提供两套预测:Function 一栏统计动态 FastAPI 流量,CDN 一栏统计所有访客流量。这样一来,Function Invocations 下降就不会再被误解为 Edge Requests 或传输量也会等幅下降。

使用全局中间件的团队

采用顶层日志、租户解析或身份验证中间件的团队,应预期静态挂载点默认仍会留在 Function 上。真正需要判断的是,是否存在一块明确公开、可以绕过这些中间件的资源区域。如果答案是否定的,就不能安全地把此次变化计入节省预算。

用一次部署完成审计

应从真实路由清单出发,而不是假定所有带扩展名的文件都是公开资源。

  1. 标记公开路径与受保护路径

    列出每个 app.frontend() 目录和 StaticFiles 挂载点。标记可以返回给任意访客的文件;再单独标出响应取决于用户、租户、角色、cookie 或请求时中间件结果的内容。

  2. 检查声明顺序

    如果某条 Function 路由必须优先匹配,就把它放在 StaticFiles 挂载点之前。Vercel 文档给出的模式如下:

    Python
    from fastapi import FastAPI
    from fastapi.staticfiles import StaticFiles
    
    app = FastAPI()
    
    # Declared before the mount, so this route wins over any CDN file at this path.
    @app.get("/static/protected.json")
    def protected():
        return {"access": "denied"}
    
    app.mount("/static", StaticFiles(directory="static"))
  3. 让受保护路径继续经过 Function

    更改配置前,应检查顶层中间件、子应用中间件和前端依赖项。除非每个受影响的文件都确实公开,否则不要仅为了让图表下降而设置 cdn = true。如果所有匹配流量都必须经过 FastAPI,请使用 cdn = false

  4. 决定是否精简部署包

    如果运行中的应用从不读取已提升的文件,可以使用文档中的设置,将其源目录排除在 Function 部署包之外:

    TOML
    [tool.vercel.fastapi.static]
    exclude = true

    如果运行时代码仍需要这些文件,则保留默认设置。

  5. 部署并核验流量分流

    运行 vc deploy。分别访问一个公开文件、一个受保护文件和一条 API 路由。先确认受保护响应仍然正确,再到 Usage 中比较项目的 Function Invocations、Active CPU、Provisioned Memory、Fast Origin Transfer、Edge Requests 和 Fast Data Transfer。公开样本应离开 Function 路径,但不能从 CDN 总量中消失。

节省空间的真实上限

Pro 的直接调用价格只有每 100 万次 $0.60。对于小型应用,节省的现金可能只有几美分,甚至会被月度用量抵扣额度覆盖。更重要的价值,往往是从 Function 用量中清除资源请求噪声,把计算余量留给真正的 API 工作。

公开资源流量越大、旧 Function 路径占用内存的时间越长,或响应产生的 Fast Origin Transfer 越多,节省就越明显。如果文件原本就在 public/ 中、流量较低,或者安全规则确实要求路径留在 Function 上,收益就会很小。

这也不能替代资源优化。同一个大型 JavaScript 打包产物、图片或字体,依然必须通过 CDN 传给访客。缩小这些文件,才是降低 Fast Data Transfer 的办法。

本周一该做什么

如果 app.frontend()StaticFiles 正在分发公开文件,而且这些请求出现在 Function 用量中,就应在本周行动。如果文件受保护,但访问规则尚未拆分,就先等待。如果相关文件原本已来自 public/ 或另一条 CDN 路径,则不受此次变化影响。

周一先盘点公开与受保护的资源路径,保留所有必须执行的路由与检查,再针对每一类请求各取一个样本,核验一次部署。预算只采用实测的 Function 用量降幅,同时把 CDN 请求和传输继续留在账目中。

如果还想阅读更多用直白语言拆解平台变化及其运营账单影响的文章,欢迎订阅邮件通讯

最近更新
2026年9月13日
分类
Explained

在 Google 中优先显示本站

将 omidsaffari.com 添加为 Google 搜索的优先来源

把 omidsaffari.com 设为优先来源,Google 会在 Top Stories、AI Overviews 和 AI Mode 中为您优先展示。

OpenAI API 密钥轮换:别等过期才救火

OpenAI API 密钥轮换:别等过期才救火

OpenAI 已支持为项目 API 密钥设置到期日,并可在组织或项目层级限制最长有效期。本文拆解一套可执行的 OpenAI API 密钥轮换流程:明确负责人和维护预算,提前创建替代密钥,经密钥库部署并验证真实任务,最后再撤销旧密钥,避免定时 Agent、批处理任务与客户自动化因凭证失效而中断。2026年9月13日Explained
Vercel 连接器权限:共享凭据如何指定负责人

Vercel 连接器权限:共享凭据如何指定负责人

Vercel 为 Pro 和 Enterprise 团队推出连接器权限,让 Owner 将共享连接器交给指定的 Connector Manager 管理。本文梳理 Member 默认权限、提供商 scope、运行时令牌与业务审批的边界,并用可验证的交接流程说明如何缩小共享凭据的变更范围。2026年9月13日Explained
Cloudflare AI Search 接入 R2:AI 搜索不再要求文件扩展名

Cloudflare AI Search 接入 R2:AI 搜索不再要求文件扩展名

Cloudflare AI Search 现可依据 HTTP Content-Type 索引无扩展名的 R2 对象,无需改动稳定键。本文说明支持范围、4 MB 限制、R2 元数据修复成本、同步节奏与验证流程,并给出可直接落地的 Worker 上传示例,帮助团队判断该更新能否简化现有 AI 搜索管线。2026年9月12日Explained
Vercel Sandbox 扩容至 64 GB:大型 Agent 任务如何改单机运行

Vercel Sandbox 扩容至 64 GB:大型 Agent 任务如何改单机运行

Vercel Sandbox 将默认工作存储从 32 GB 提升至 64 GB。本文拆解这次扩容对大型代码仓库、AI Agent 修复、构建与落盘型数据任务的实际影响,并给出一套完整的峰值空间测量方法、持久化与 Drive 成本边界,以及判断是否可以安全取消清理或拆分流程的验证步骤。2026年9月12日Explained
Cloudflare Workflows 保留期缩短后,运行历史该怎么留

Cloudflare Workflows 保留期缩短后,运行历史该怎么留

Cloudflare 已将新建 Workers Paid Workflow 的已完成与错误实例状态默认保留期从 30 天缩短为 7 天。本文拆解这项变化对故障调查窗口、成功与错误历史配置以及 GB-month 存储成本的影响,并给出一套可执行的保留策略,帮助团队避免证据先于事故暴露而过期的风险。2026年9月11日Explained
用 ChatGPT 数据分析改造每周报表:减少反复交接

用 ChatGPT 数据分析改造每周报表:减少反复交接

ChatGPT Data 已进入 Work 与 Codex。本文拆解如何用 ChatGPT 数据分析把每周报表从反复交接改造成可刷新的工作流,并逐项说明语义层、数据源权限、Site 分享边界、人工复核与真实成本。还提供财务、营收运营、代理商和产品运营场景,以及一套从私密报告开始、通过核验后再安排刷新的试点步骤。2026年9月11日Explained
Cursor Projects 实测:团队真正要管的是审查队列

Cursor Projects 实测:团队真正要管的是审查队列

Cursor Projects 将协调 Agent、共享上下文和周期性触发器整合进长期工作容器,也把团队瓶颈从启动任务转向人工审查。本文拆解这项 beta 如何改变 AI 编程工作流,并给出一套有边界的试点方法:怎样配置上下文、控制模型成本、安排审查队列,以及用哪些指标判断它是否值得团队继续采用。2026年9月11日Explained
ChatGPT Deep Research 进入 Work:研究与 Codex 共用额度

ChatGPT Deep Research 进入 Work:研究与 Codex 共用额度

ChatGPT Deep Research 已进入 Work 和 Codex,研究任务会消耗 Work/Codex 共用额度。本文拆解 Chat 独立任务额度与 Work/Codex 按 token 计费的区别,并说明团队如何控制范围、核查引用与交付物,避免研究挤占后续执行预算。2026年9月10日Explained
订阅通讯

每周日,一封信。写运转中的系统,不写热评。

每周一期。无垃圾邮件。随时退订。