首页
/ FastAPI 云部署实践:从任意云厂商到 FastAPI Cloud 一键上线

FastAPI 云部署实践:从任意云厂商到 FastAPI Cloud 一键上线

2026-09-06 15:37:04作者:苗圣禹Peter

本篇围绕 FastAPI 官方文档中"Deploy FastAPI on Cloud Providers"这一主题展开:说明为什么 FastAPI 应用可以部署到几乎任何云厂商,介绍由 FastAPI 同一作者与团队打造的 FastAPI Cloud 一键部署流程,并结合同仓部署文档与 CLI 源码,给出自管云服务器部署时的 HTTPS、开机自启、崩溃重启、进程复制(workers)、内存与启动前置步骤等关键工程要点。读完你可以独立完成一次真实的 FastAPI 云上部署决策:选托管云服务、用 fastapi run 自管机器,或用 FastAPI Cloud 一条命令上线。

1. 核心结论:几乎任何云厂商都能部署 FastAPI

官方文档 cloud.md 的开篇即给出明确结论:

You can use virtually any cloud provider to deploy your FastAPI application.

其背后的原因在于 FastAPI 是一个基于标准(ASGI)的开源 Web 框架——只要目标环境能运行一个 ASGI 服务器进程(如 Uvicorn),就能承载 FastAPI 应用。文档同时指出:主流云厂商大多已提供部署 FastAPI 的官方指南,你可以直接跟随所选厂商的文档操作。

这一点在仓库源码层面可以印证:FastAPI 的 fastapi 命令行入口本身非常薄,fastapi/cli.py 只是把 main 委托给 fastapi_cli 包;若未安装 fastapi[standard] 依赖,CLI 会直接报错并提示安装。这说明"部署到云端"依赖的是一套标准、可移植的命令行 + ASGI 服务器组合,而非任何特定云厂商的私有运行时。

此外,文档还提到一部分云厂商(如 RenderRailway)是 FastAPI 项目的赞助商,官方建议读者可以关注这些厂商的指南并试用其服务。由于本仓库不输出外部链接,此处仅保留厂商名称,具体指南请查阅对应厂商文档。

2. 三条可选的部署路径

围绕"部署到云上",文档与同目录的部署系列给出了三条典型路径,你可以按团队能力与成本自由选择:

路径 适用场景 你需要做的事 官方对应文档
FastAPI Cloud 托管 想最小成本、最快上线 一条命令 fastapi deploy fastapicloud.md
主流云厂商托管(Render、Railway 等) 希望用厂商生态(CI、账单、域名) 跟随厂商指南部署 ASGI 应用 cloud.md
自管云服务器 / VM 需要完全控制底层 安装 ASGI 服务器 + 进程管理 + TLS 终结 manually.mddocker.md

"部署"一词本身的含义见部署总览 index.md:把应用放到一台远程机器上,由一个高性能、稳定的服务器程序持续对外提供服务,区别于"改代码—打断—重启"的开发阶段。

3. FastAPI Cloud:一条命令部署到云端

fastapicloud.md 给出的完整流程如下:

$ uv run fastapi deploy

Deploying to FastAPI Cloud...

✅ Deployment successful!

🐔 Ready the chicken! Your app is ready at https://myapp.fastapicloud.dev

关键行为说明(均出自上述官方文档):

  • 自动探测应用:CLI 会自动检测你的 FastAPI 应用并部署到云端;
  • 自动登录:如果尚未登录,会打开浏览器完成认证;
  • 托管职责:FastAPI Cloud 会替你处理部署中的大多数事项,包括 HTTPS基于请求量的自动扩缩容(replication + autoscaling) 等;
  • 定位:FastAPI Cloud 由 FastAPI 的同一作者与团队打造,是 FastAPI and friends 开源项目的主要赞助商与资金提供方。

一个提升体验的细节:CLI 依赖 pyproject.toml 中配置的入口来定位应用。按 fastapi-cli.md 的说明,推荐显式声明:

[tool.fastapi]
entrypoint = "main:app"

文档明确提示,像 VS Code 扩展、FastAPI Cloud 这样的外部工具同样依赖该配置来找到你的应用,因此推荐把 entrypoint 写入 pyproject.toml,而不是每次在命令行传 --entrypoint

4. 自管云服务器:用 fastapi run 跑生产进程

如果你选择自己的云服务器(VM、云主机等),核心命令是 fastapi run。官方 manually.md 示例:

$ fastapi run main.py

  FastAPI  Starting production server 🚀

             Searching for package file structure from directories
             with __init__.py files
             Importing from /home/user/code/awesomeapp

   module  🐍 main.py

     code  Importing the FastAPI app object from the module with
             the following code:

             from main import app

      app  Using import string: main:app

   server  Server started at http://0.0.0.0:8000
   server  Documentation at http://0.0.0.0:8000/docs

生产模式与开发模式的差异(依据 fastapi-cli.md):

  • fastapi run 默认关闭 auto-reload,并监听 0.0.0.0(所有可用 IP),因此可被机器外的客户端访问——这正是生产环境(例如容器内)的标准跑法;
  • fastapi dev 则监听 127.0.0.1 并开启自动重载,仅限本地开发。它会在导入应用前把环境变量 FASTAPI_ENV 设为 development(已存在则保留),fastapi run 则不修改该变量,如果你的应用需要识别生产模式,请自行显式设置;
  • fastapi run 在多数情况下应搭配一个处理 HTTPS 的"终结代理(termination proxy)"——这部分要么由云厂商代劳,要么自己搭建。

若不想用 CLI,也可以直接跑 ASGI 服务器。FastAPI 遵循 ASGI(Asynchronous Server Gateway Interface) 标准,文档列出的可选服务器包括 Uvicorn(fastapi 命令默认使用)、Hypercorn、Daphne、Granian。手动方式示例:

$ uv add "uvicorn[standard]"

$ uv run uvicorn main:app --host 0.0.0.0 --port 80

其中 uvicorn main:app 的导入串含义为:mainmain.py 模块,app 指其中 app = FastAPI() 创建的对象,等价于 from main import app。文档同时警告:--reload 选项消耗更多资源且更不稳定,只应用于开发,生产环境不要使用

5. 部署的六个核心概念(选型时的决策清单)

concepts.md 系统化了云上部署必须考虑的概念,也是评估"某云厂商/某套工具是否适合你"的清单:

  1. 安全 - HTTPS:HTTPS 加密通常由应用之外的 TLS 终结代理完成(Traefik、Caddy 可自动续证;Nginx/HAProxy 需搭配 Certbot;Kubernetes 可用 Ingress Controller + cert-manager;或由云厂商在托管服务内代管)。若你使用托管云服务,这部分往往由厂商包办。
  2. 开机自启(Running on startup):在远程服务器上手动 fastapi run 只能算开发态——一旦连接断开或机器重启,进程就静默死亡。生产上需要 Docker、Kubernetes、Docker Compose、Systemd、Supervisor 或云厂商托管机制保证 API 进程随机器启动而启动,且无需人工干预。
  3. 崩溃重启(Restarts):FastAPI 会把多数错误限制在触发它的那一个请求内(客户端收到 500,应用继续服务后续请求);但极端 bug 仍可能让整个 Uvicorn/Python 进程崩溃。此时需要外部组件负责重启进程——通常与"开机自启"由同一套工具(Docker、Kubernetes、Systemd 等)承担。文档提示:如果应用是启动即崩,无限重启没有意义,这类问题一般在开发期或部署初期就会被发现。
  4. 复制(Replication,即进程数量):单个 FastAPI 进程可以并发服务多个客户端,但多核服务器上通常希望运行多个 worker 进程分摊请求。关键约束是同一台服务器上,同一"IP + 端口"组合只能被一个进程监听,因此必然存在一个 Manager 进程监听端口,再把流量分发给各 worker。可选策略:
    • Uvicorn 的 --workers:一个 Uvicorn 管理进程监听 IP/端口,派生多个 Uvicorn worker;
    • Kubernetes 等容器编排:编排层监听端口,通过多个容器(每容器一个 Uvicorn 进程)实现复制;
    • 托管云服务:由云厂商替你完成复制,你通常只需提供要运行的进程或容器镜像,内部往往仍是单 Uvicorn 进程。
  5. 内存(Memory):多进程之间默认不共享内存——每个 worker 都会各自加载一份模型/大文件到 RAM。文档给出的算例:若代码加载一个 1 GB 的机器学习模型,1 个进程至少占 1 GB RAM;开 4 个 worker 则总计约 4 GB;如果服务器只有 3 GB 内存就会出问题。因此"worker 数 × 单进程内存"必须在机器容量之内。
  6. 启动前置步骤(Previous steps before starting):如数据库迁移,通常只希望执行一次。必须保证这些步骤由单一进程执行,即使应用本身随后以多 worker 方式运行——否则多个进程并行执行迁移会产生冲突。可行策略包括 Kubernetes 的 Init Container,或一个"先跑迁移、再启动应用"的 bash 脚本(但该脚本自身也需要被纳入启动/重启管理)。

另外,文档还专门讨论了资源利用率:付费服务器应尽量吃满资源而不崩溃,文档建议把 CPU/RAM 利用率目标定在约 50%~90% 区间,并预留应对流量尖峰(如 API 走红、被其他服务/爬虫调用)的余量,可用 htop 或更复杂的监控系统观测。

6. 实操:用 --workers 做进程复制

server-workers.md 给出了自管服务器场景下最常用的复制手段:

# 方式一:fastapi 命令
$ fastapi run --workers 4 main.py

# 方式二:直接调用 uvicorn
$ uv run uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4

日志中会显示父进程(process manager,如 PID 27365)与各 worker 进程(27367–27370)的 PID——这正对应了第 5 节"单端口由 Manager 进程独占、再分发到 worker"的架构。文档也提醒:在 Kubernetes 上通常不建议使用 --workers,而是每容器跑单 Uvicorn 进程、由编排层做复制(详见 docker.md)。

需要说明的是:--workers 只覆盖了六大概念中的"复制",并略微帮助"重启";HTTPS、开机自启、崩溃重启、内存规划与前置步骤仍需你自己(或 Docker/Kubernetes 等工具)处理。

7. 落地建议:按场景对号入座

综合 cloud.md 的核心主张与同目录部署系列的细节,可以得出如下决策路径:

  1. 追求最快上线:在 pyproject.toml 配置好 [tool.fastapi] entrypoint 后执行 uv run fastapi deploy,HTTPS 与按请求自动扩缩容由 FastAPI Cloud 代管;
  2. 已有云厂商偏好:遵循 Render、Railway 等厂商(同时也是 FastAPI 赞助商)的官方指南,在其托管环境内以 fastapi run 或容器镜像方式启动单进程应用,由平台负责复制与 HTTPS;
  3. 自管服务器/VMfastapi run(生产模式、监听 0.0.0.0)+ 进程管理器(Systemd/Docker 等保证开机自启与崩溃重启)+ TLS 终结代理(Caddy/Traefik/Nginx+Certbot 等)+ 按内存与核数决定 --workers,并确保迁移等前置步骤只由单进程执行一次。

无论走哪条路径,FastAPI 基于 ASGI 标准的开放特性都保证了部署目标的可移植性;而上述六大概念则是你评估任何(包括尚不存在的)部署环境时可以直接复用的工程清单。

登录后查看全文
热门项目推荐
相关项目推荐