FastAPI 手动部署指南:从fastapi run到生产级 ASGI 服务器配置
【免费下载链接】fastapiFastAPI framework, high performance, easy to learn, fast to code, ready for production项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi
本篇技术指南聚焦于 FastAPI 应用在生产环境中的手动部署方式:先介绍开箱即用的fastapi run命令,再深入讲解 ASGI 服务器(Uvicorn 等)的安装与手动启动方法,最后梳理部署前必须理解的核心概念(HTTPS、开机自启、重启、进程复制、内存、启动前步骤)。读完本文,你将掌握如何在一台远程 Linux 服务器上亲手把 FastAPI 应用跑起来,并为后续容器化、多进程等进阶部署打下基础。
一、最简方案:使用fastapi run命令
绝大多数场景下,启动一个 FastAPI 应用只需要一条命令:
$ 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 Logs: 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)这条命令默认监听0.0.0.0:8000,自动探测模块结构并导入应用对象,同时为你托管交互式 API 文档(/docs)。它可以直接用于在容器、云服务器、虚拟机等场景中启动 FastAPI 应用。
fastapi命令从哪来?
从仓库源码看,fastapi命令的入口定义在 pyproject.toml:
[project.scripts] fastapi = "fastapi.cli:main"而 fastapi/cli.py 中可以看到,真正的 CLI 实现来自独立的fastapi-cli包:
try: from fastapi_cli.cli import main as cli_main except ImportError: # pragma: no cover cli_main = None如果未安装fastapi-cli,运行fastapi命令会提示你安装fastapi[standard]。在 pyproject.toml 的standard可选依赖中可以看到,fastapi[standard]同时会带来fastapi-cli[standard]与uvicorn[standard] >=0.12.0——这就是为什么fastapi run内置了生产级服务器 Uvicorn。
二、认识 ASGI 服务器
FastAPI 基于 Python 的ASGI(Asynchronous Server Gateway Interface,异步服务器网关接口)标准构建,它本身是一个ASGI Web 框架。要在远程服务器上运行 FastAPI 应用(或任何其他 ASGI 应用),核心要件是一个ASGI 服务器程序,例如Uvicorn——这也是fastapi命令默认携带的服务器。
常见的 ASGI 服务器替代品包括:
| 服务器 | 特点 |
|---|---|
| Uvicorn | 高性能 ASGI 服务器,FastAPI 默认选择 |
| Hypercorn | 兼容 HTTP/2 与 Trio 异步库,功能更丰富 |
| Daphne | 为 Django Channels 打造的 ASGI 服务器 |
| Granian | 面向 Python 应用的 Rust 实现的 HTTP 服务器 |
不同 ASGI 服务器的启动命令大同小异,具体参数可查阅各自文档。对于 FastAPI 项目,Uvicorn 是最主流、与生态集成最顺畅的选择。
三、两个易混淆的概念:服务器机器与服务器程序
"服务器"这个词在日常语境中通常指代两种截然不同的东西:
- 远程/云计算机器:物理机或虚拟机,通常运行 Linux,是程序运行的载体。它也可能被称为机器(machine)、虚拟机(VM)、节点(node)。
- 服务器程序:运行在那台机器上的软件进程,例如 Uvicorn。
阅读资料时遇到 "server" 一词,先判断它指的是哪一层——是买来的那台机器,还是跑在机器上的程序。这一区分对理解后续的部署方案至关重要。
四、手动安装 ASGI 服务器程序
安装 FastAPI 时默认自带生产级服务器 Uvicorn,可直接用fastapi run启动。但如果你希望手动安装并控制ASGI 服务器,以 Uvicorn 为例:
$ uv add "uvicorn[standard]" ---> 100%💡提示
追加
standard标识后,Uvicorn 会安装并启用一组推荐的额外依赖,其中包含uvloop——asyncio的高性能替代实现,能显著提升并发性能。同理,执行uv add "fastapi[standard]"时也会一并获得uvicorn[standard]。这一点在 pyproject.toml 中也有印证:standard与all两组可选依赖均声明了uvicorn[standard] >=0.12.0。
其他 ASGI 服务器(Hypercorn、Daphne、Granian 等)的安装流程完全类似。
五、手动运行服务器程序:理解导入字符串
手动安装 ASGI 服务器后,启动时需要以特定格式传入导入字符串(import string),让服务器找到你的 FastAPI 应用:
$ uv run uvicorn main:app --host 0.0.0.0 --port 80 INFO: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit)其中uvicorn main:app的含义是:
main:Python 模块,即文件main.py;app:在main.py内通过app = FastAPI()创建的应用对象。
它完全等价于 Python 代码:
from main import app命令行中的--host 0.0.0.0让服务器监听所有网络接口(从而允许外部客户端访问),--port 80则指定监听端口(默认 8000,80 是 HTTP 标准端口)。每个替代的 ASGI 服务器程序都有类似的命令形式,细节请查阅对应文档。
⚠️警告
Uvicorn 等服务器支持
--reload选项,它在开发阶段非常有用,可以监听代码变化自动重启。但--reload会消耗多得多的资源、稳定性也更差,生产环境绝不应该使用。生产部署应当使用稳定、常驻的进程运行方式。
六、部署核心概念:上线前必须想清楚的事
上述示例的运行方式本质是:启动单个进程,在所有 IP(0.0.0.0)的预定义端口(如80)上监听。这是最基础的形态,但生产环境通常还需要处理更多问题:
- 安全(HTTPS):为 API 提供加密传输,通常由应用服务器之外的TLS 终止代理(如 Traefik、Caddy、Nginx、HAProxy 或 Kubernetes Ingress)负责,并处理证书自动续期;也可以交由云服务商托管。
- 开机自启:远程服务器重启后(例如系统更新、云厂商迁移),手动启动的进程不会自动恢复。需要借助 Docker、Kubernetes、Docker Compose、Swarm 模式、Systemd、Supervisor 等独立程序,让应用在服务器启动时自动拉起,无需人工干预。
- 重启(崩溃恢复):FastAPI 通常能把代码错误限制在触发错误的单个请求内,客户端只收到
500 Internal Server Error,应用继续服务后续请求;但若代码导致整个进程崩溃,则需要外部组件负责重启进程。通常负责开机自启的工具同时负责自动重启。 - 复制(进程数/Worker):单进程即可并发服务多个客户端;当单机多核、客户端量超过单进程承载能力时,可以运行多个 worker 进程分摊请求。
fastapi run --workers 4或uvicorn main:app --workers 4即可启动多进程(详见 Server Workers - Uvicorn with Workers)。注意:同一 IP 与端口组合只能有一个进程监听,必须由一个管理进程统一监听端口并把通信分发到各 worker。 - 内存:多个进程之间不共享内存。例如代码加载了 1 GB 的机器学习模型,启动 4 个 worker 就会占用约 4 GB RAM;如果服务器只有 3 GB 内存就会出问题。衡量资源利用率(如用
htop观察 CPU 与内存),目标是在"尽可能充分利用资源"与"留有余量避免崩溃"之间取平衡。 - 启动前步骤:例如数据库迁移,通常只需执行一次,应由单个进程完成;若由多个 worker 并行执行,可能产生重复操作甚至相互冲突。常见策略是 Kubernetes 的 Init Container,或用先执行前置步骤再启动应用的 bash 脚本。
关于上述概念的完整讲解与具体工具对比,可继续阅读 Deployments Concepts;容器化部署方案见 FastAPI in Containers - Docker;HTTPS 与证书细节见 About HTTPS。
七、小结
手动部署 FastAPI 应用的两条主路径清晰明了:
- 开箱即用:
fastapi run main.py——FastAPI 自带的 Uvicorn 生产服务器直接启动,适用于绝大多数场景; - 手动掌控:
uv add "uvicorn[standard]"+uv run uvicorn main:app --host 0.0.0.0 --port 80——自己安装并精确控制 ASGI 服务器。
在此基础上,生产环境还需要依次解决 HTTPS、开机自启、崩溃重启、多进程复制、内存规划与启动前步骤等部署概念。理解这些概念,你就拥有了在任何环境(甚至未来尚未出现的技术栈)中自主设计 FastAPI 部署方案的直觉与能力。
【免费下载链接】fastapiFastAPI framework, high performance, easy to learn, fast to code, ready for production项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考