FastAPI 应用部署指南:从开发环境到生产可用的核心概念与关键策略
【免费下载链接】fastapiFastAPI framework, high performance, easy to learn, fast to code, ready for production项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi
部署是任何FastAPI应用从“本地能跑”走向“线上可用”的必经之路。本文基于本仓库葡萄牙语文档docs/pt/docs/deployment/index.md的脉络展开,讲解“部署”的确切含义、开发与生产环境的本质差异,以及你在选择具体部署方案前必须掌握的概念清单(HTTPS、开机自启、重启机制、多进程复制与内存、启动前准备)。读完你将理解 FastAPI 应用在生产服务器上到底需要什么,并能据此评估 Uvicorn 单进程、--workers多进程、Docker 容器与云平台等不同策略各自解决什么问题。
部署(Deployment)到底意味着什么
原文出处:docs/pt/docs/deployment/index.md
“部署”(Deployment)指的是执行一系列必要步骤,让你的应用可以被用户访问。对web API而言,这通常意味着:
- 把它放到一台远程机器上(物理服务器或云虚拟机);
- 配合一个服务器程序提供良好的性能与稳定性;
- 让用户能够高效、无中断、无故障地访问它。
FastAPI 团队在文档中特别强调了一个反差点:开发阶段,你不断修改代码、制造 bug 又修复、反复停止和重启开发服务器;而部署阶段的目标恰恰相反——追求稳定性、连续性和资源利用效率。
注意:这里讨论的核心是“应用本身的可运行形态”,它是后续部署细节(HTTPS、进程管理、容器化等)的前提。真正的操作细节分散在
docs/pt/docs/deployment/目录下的多篇专门文档中。
部署策略:自己搭服务器还是用云服务
关于“怎么部署”,文档给出的结论是:没有唯一的正确答案,取决于你的具体用例与所用工具。总体可分为几类策略:
- 自建服务器:自己组合工具链,把 FastAPI 应用部署到你拥有或租用的机器上;
- 云服务(PaaS 等):由云平台替你完成部分甚至大部分部署工作;
- 两者之间的其他选项:例如部分托管、混合架构等。
从本仓库的部署文档结构可以清楚看到官方推荐的“学习/决策路径”,这也是本文接下来要展开的主干:
- docs/pt/docs/deployment/versions.md:部署前先确定如何固定与升级 FastAPI 版本;
- docs/pt/docs/deployment/https.md:理解 HTTPS 如何保护你的 API;
- docs/pt/docs/deployment/concepts.md:贯穿所有部署方案的核心概念;
- docs/pt/docs/deployment/manually.md:手动运行服务器的具体命令;
- docs/pt/docs/deployment/server-workers.md:Uvicorn 多 worker 并行处理;
- docs/pt/docs/deployment/docker.md:容器化部署(Docker/Kubernetes);
- docs/pt/docs/deployment/cloud.md 与 docs/pt/docs/deployment/fastapicloud.md:云平台部署。
部署前必须固定依赖版本
在进入服务器配置之前,一个容易被忽视但非常关键的步骤是版本管理。详见 docs/pt/docs/deployment/versions.md。
- 固定你的
fastapi版本:指定精确版本号(例如fastapi==0.115.0),避免在不知情时被升级到不兼容的新版本; - 了解 FastAPI 的依赖层次:FastAPI 本身构建于Starlette(提供 Web 工具/路由/中间件等)与Pydantic(负责数据校验)之上。
这一点可以由本仓库的依赖声明直接印证:pyproject.toml 中列出dependencies为starlette>=0.46.0、pydantic>=2.9.0等;同时其[project.optional-dependencies]中定义了standard组,将fastapi-cli[standard]、uvicorn[standard]、httpx、jinja2、python-multipart等一并打包——这就是安装“标准全家桶”的入口:
$ pip install "fastapi[standard]"也就是说,仅仅安装fastapi核心包并不保证自带生产服务器,需要额外按上述方式安装standard扩展组。在部署文档语境下,这条命令是后续所有“如何启动应用”操作的前提。
HTTPS:所有部署方案绕不开的安全层
生产环境的第一要务是传输安全。文档在 docs/pt/docs/deployment/https.md 中系统讲解了 HTTPS 的核心知识,其要点可归纳为:
- HTTPS 为你的 API 提供端到端加密,防止请求/响应内容被窃听与篡改;
- 在生产实践中,HTTPS 通常不是由你的应用服务器直接实现,而是由一个外部的 TLS 终止代理(TLS termination proxy)完成;
- 必须有一个组件负责HTTPS 证书的续期——它可以是同一个代理组件,也可以是独立组件。
在 docs/pt/docs/deployment/concepts.md 中,官方还给出了可选的 TLS 终止代理工具清单,帮助你根据“是否需要额外组件做证书续期”来选型:
| 代理工具 | 证书续期方式 |
|---|---|
| Traefik | 自动处理证书续期 |
| Caddy | 自动处理证书续期 |
| Nginx | 配合 Certbot 等外部组件 |
| HAProxy | 配合 Certbot 等外部组件 |
| Kubernetes + Nginx Ingress Controller | 配合 cert-manager 等外部组件 |
| 云平台内置管理 | 作为其托管服务的一部分提供 |
此外文档也指出:如果选择云服务,它可能已经把 HTTPS 配置包含在服务中(可能附带限制或更高费用),此时你就不必自行搭建 TLS 终止代理。
程序与进程:理解“跑起来”的最小单元
在部署语境中,你会反复听到“进程”这个词。concepts 一章(docs/pt/docs/deployment/concepts.md)特意澄清了两个易混淆的词:
- 程序(Program):含义较宽泛——你写的 Python 代码文件、系统里可执行的文件(如
python、uvicorn)、甚至正在运行的实例都可能被称作“程序”; - 进程(Process):含义更精确——特指“正在操作系统里运行着的那个程序”,它占用 CPU、持有内存,可以被你或操作系统终止;同一程序的多个实例可以同时作为多个进程运行。
一个关键推论是:任何代码只有处于“运行中的进程”里才能真正做事。因此讨论“重启”“崩溃”“多 worker”“内存占用”时,本质都是在讨论进程的创建、运行与终止——这正是 Uvicorn 这类 ASGI 服务器替你管理的东西。
面向部署的其他核心概念
concepts 一章还逐个讨论了其余部署概念,它们共同构成评估任何部署方案的思维框架:
- 开机自启(Running on Startup):服务器重启或断电恢复后,你的应用进程需要能被自动拉起,而不是等人手动启动;这通常需要 systemd、Supervisor 等工具,或在容器环境中交由编排系统处理;
- 重启(Restarts):人总会犯错、代码会出小 bug、进程可能因较大错误而崩溃。小错误通常会被自动处理(例如返回 500),但崩溃的进程需要某种机制自动重启以维持可用性;
- 复制/多进程(Replication):为了利用多核 CPU、处理更多并发请求,通常要同时运行多个 worker 进程——每个进程监听同一套应用,但只有一个进程占用对外端口;
- 内存(Memory):每个进程都有独立的内存占用。多进程意味着总内存按进程数成倍增长,因此 worker 数量要结合服务器内存容量来规划;
- 启动前准备(Previous Steps):如数据库迁移、静态资源准备等,需在服务真正对外接收流量前完成。
文档强调:把这些概念想清楚,你就有能力去评估和设计适合自己场景(甚至未来还不存在的环境)的部署方案。
手动运行服务器:fastapi run与直接使用 Uvicorn
如果你想自建服务器,最小可用的落地方式是“手动运行”。详细命令参见 docs/pt/docs/deployment/manually.md,其推荐路径如下。
用fastapi run一键启动(默认推荐)
安装fastapi[standard]后,fastapi命令即可用。官方推荐用它对生产环境一键启动:
$ fastapi run main.py FastAPI Starting production server 🚀 ... 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 INFO Started server process [2306215] INFO Waiting for application startup. INFO Application startup complete. INFO Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)fastapi run的适用面很广——你可以在容器里、在裸服务器上、在任意位置用它启动 FastAPI 应用。
ASGI:FastAPI 的服务器接口
FastAPI 遵循ASGI(Asynchronous Server Gateway Interface)标准:FastAPI 本身是 ASGI框架,而真正在远端机器上替你“跑起来”的是一个ASGI 服务器程序。官方在文档中列举了多款可选 ASGI 服务器:
- Uvicorn:高性能 ASGI 服务器,也是
fastapi命令内置的默认服务器; - Hypercorn:支持 HTTP/2 与 Trio 等特性;
- Daphne:为 Django Channels 构建的 ASGI 服务器;
- Granian:基于 Rust 的 Python HTTP 服务器。
从仓库源码可以确认fastapi命令的实质:入口 fastapi/main.py 直接调用 fastapi/cli.py 中的main(),而该文件内部实际是导入并转发fastapi_cli.cli.main——真正的 CLI 逻辑由依赖包fastapi-cli提供;若未安装fastapi[standard],fastapi/cli.py 会提示先执行pip install "fastapi[standard]"。这就解释了为什么文档强调“安装 FastAPI 时自带 Uvicorn,可用fastapi run启动”,同时也说明该命令与 Uvicorn 的绑定关系。
直接使用uvicorn命令
也可以绕过fastapi直接安装并运行 Uvicorn。先在项目里声明服务器应用依赖(例如uvicorn[standard],这正是本仓库standard可选依赖所包含的内容),然后:
$ uvicorn main:app --host 0.0.0.0 --port 8000其中main:app的写法即“导入字符串”:main是你的 Python 模块,app是该模块中创建的 FastAPI 实例。手动方案里,--host、--port都由你自行控制。
补充说明:两个“服务器”
文档还提示了一个易混淆点:“服务器”一词既可能指远端那台机器(也称 machine、VM、node,通常运行 Linux),也可能指机器上运行的服务器程序(如 Uvicorn)。阅读任何部署资料时,先分清语境是哪种含义。
用多个 worker 榨干多核 CPU
手动运行默认是单进程。若想利用多核并服务更多请求,就需要“进程复制”——详见 docs/pt/docs/deployment/server-workers.md。
两种等价的启动方式:
$ fastapi run --workers 4 main.py$ uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4多 worker 模式下日志会清晰展示进程结构:一个父进程(负责进程管理)加上 N 个worker 子进程。例如上面的输出会出现:
INFO: Started parent process [27365] INFO: Started server process [27368] INFO: Started server process [27369] INFO: Started server process [27370] INFO: Started server process [27367]27365是父进程(进程管理器);27368、27369、27370、27367是四个 worker 进程。
文档强调:--workers主要解决的是复制/多进程问题,并顺带带来一些崩溃重启的韧性;但HTTPS、开机自启、内存规划、启动前准备等概念仍需由你额外解决。换言之,多 worker 只是部署拼图的一块。
重要提示:Kubernetes 场景通常不用 worker
该章特别提示:如果你用容器化(Docker / Kubernetes),细节见 docs/pt/docs/deployment/docker.md;尤其是跑在Kubernetes上时,通常不要在单个容器内启用多个 worker,而是由 K8s 通过“每 Pod 一个 Uvicorn 单进程”的方式横向扩缩容,把“复制/重启”交给编排平台管理。
让 Docker / Kubernetes 接管其余概念
部署概念 中列出的 HTTPS、开机自启、自动重启、多进程、内存、启动前准备,靠裸机手配颇为繁琐;而容器化编排恰好提供了解决这些问题的现成手段:
- 镜像与容器:把应用、Python 依赖与运行命令打包成镜像,启动成容器,用 Dockerfile 声明一切;
- 进程模型:官方 Docker 章节推荐在容器里以单进程 Uvicorn 运行(例如
CMD ["fastapi", "run", "app/main.py", "--port", "80", "--proxy-headers"]); - HTTPS 与重启:交给 Ingress 控制器、探针与平台的重启策略;
- 复制与内存:交给 K8s 的 Replica/Pod 调度。
完整的 Dockerfile 写法、构建镜像(docker build)与运行容器(docker run)的步骤、单文件应用的镜像构建技巧,都可以在 docs/pt/docs/deployment/docker.md(共 600 余行)中找到完整可复制的示例。
云平台:把部署交出去
如果不想自己维护服务器与代理,官方也整理了云平台路线:
- docs/pt/docs/deployment/cloud.md:总览面向各类云服务商的部署方式,其中包括由 FastAPI 团队维护的FastAPI Cloud,它把 FastAPI 应用部署到云端做得尽量“顺手”,保留与本地开发 FastAPI 一致的体验;
- docs/pt/docs/deployment/fastapicloud.md:进一步说明 FastAPI Cloud 的使用边界——例如需要把应用部署到其他云服务商,或希望部署到自己的服务器时该怎么做。
结语:先有概念框架,再选具体方案
回顾本文主线,FastAPI 的部署哲学非常清晰:
- 明确“部署 = 让应用对用户可用”的目标,理解它与开发阶段的对立;
- 掌握 HTTPS、开机自启、重启、多进程、内存、启动前准备这组跨方案通用概念——它们是评估一切部署工具的统一标尺;
- 在具体动手时,按需选择:手动
fastapi run起步 →--workers多进程 → Docker/Kubernetes 容器化 → 云平台托管,每一步都在用工具替换上一步需要手工处理的概念。
无论你最终选择哪条路,文档都建议先回到 docs/pt/docs/deployment/concepts.md 的概念框架,用它去对照手头工具的每一项能力——这样即使未来出现全新的部署环境,你也能快速做出正确的架构决策。
【免费下载链接】fastapiFastAPI framework, high performance, easy to learn, fast to code, ready for production项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考