部署基础:ASGI 服务器与进程模型
本教程共 50 篇 · 第 48 篇 · 更新于 2026-08-12 · 约 7 分钟阅读
本节目标:理解 FastAPI 部署的 ASGI 本质,掌握用 fastapi run 做生产启动、用 Uvicorn workers 和 Gunicorn 跑多进程,以及端口绑定与进程管理的基本思路。
本地开发用 fastapi dev 很方便,但那是带热重载的开发模式。真正上线要用生产模式,并且要搞懂「服务器程序」「进程」「端口」这些概念。这一章打基础。
48-1 FastAPI 是 ASGI 应用
FastAPI 基于 ASGI 标准(异步服务器网关接口)。它自己不是服务器,而是一个「应用」,需要由一个 ASGI 服务器程序来运行。默认的服务器是 Uvicorn,它性能好、支持异步。
也就是说,运行你的接口实际上有两层:你的 app = FastAPI() 是应用,Uvicorn 是把它跑起来、监听端口、收发 HTTP 的服务器。常见的 ASGI 服务器还有 Hypercorn、Daphne、Granian,本册以 Uvicorn 为准。
48-2 程序、进程与端口
「服务器」这个词有两层意思:可能指那台远程 Linux 机器(云主机、虚拟机),也可能指跑在机器上的那个程序(比如 Uvicorn)。部署时要分清。
「进程」是程序真正运行起来的实例。代码只有被运行、成为进程,才会占用 CPU 和内存、处理请求。一台机器上可以同时跑多个进程。
端口方面有个硬规则:同一个 IP 地址上,一个端口同时只能被一个进程监听。比如 443 给 HTTPS、80 给 HTTP。想同时跑多个进程处理请求,必须有一个进程监听端口,再把请求分发给其它进程。
48-3 生产启动用 fastapi run
上线不要用 fastapi dev(开发含热重载)。生产用:
fastapi run main.py
它会启动 Uvicorn 的生产模式,输出默认监听 http://0.0.0.0:8000。0.0.0.0 表示监听机器上所有网卡的 IP,这样外部才能访问;若是 127.0.0.1 则只有本机能访问。
等价地,也可以直接用 Uvicorn:
uvicorn main:app --host 0.0.0.0 --port 80
uvicorn main:app 里,main 是文件 main.py,app 是里面的 app = FastAPI() 对象。这等价于 from main import app。
Warning
--reload只用于开发,会多耗资源、更不稳定。生产环境千万别加。开发用fastapi dev,生产用fastapi run。
48-4 为什么需要多进程(workers)
单个 Uvicorn 进程就能并发处理很多请求。但一台服务器往往有多个 CPU 核心,单个进程用不满它们。当请求量超过一个进程能扛的限度,就该开多个 worker 进程,把请求分到不同核心并行处理。
这些「同一个应用的多个进程」通常就叫 workers。一个进程崩了不影响其它进程,整体更稳。
48-5 Uvicorn 自带多 worker
fastapi 命令和 Uvicorn 命令都支持 --workers 设置进程数:
fastapi run --workers 4 main.py
uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4
加上 --workers 4,Uvicorn 会起一个「父进程(进程管理器)」加 4 个 worker 子进程。日志里能看到每个进程的 PID。请求由父进程监听端口、分发给 4 个 worker。
该开几个 worker?一般参考 CPU 核心数。开太多会因为内存不够反而变慢——因为每个进程都要单独占一份内存(包括你加载到变量里的大对象)。
48-6 内存是按进程算的
多个进程默认不共享内存。比如你的代码加载了一个 1GB 的模型:1 个进程占 1GB,4 个 worker 就占 4GB。如果机器总共只有 3GB 内存,开 4 个 worker 会出问题。
所以定 worker 数时,要算总内存:单进程内存 × worker 数 ≤ 机器可用内存。目标通常是把 CPU 和内存用到 50%~90%,既不过浪费也不撑爆。
48-7 Gunicorn + UvicornWorker
另一种常见组合是用 Gunicorn 当进程管理器,让它启动多个 Uvicorn worker。Gunicorn 本身是 WSGI 服务器,但它有一个 uvicorn.workers.UvicornWorker 适配器,能驱动 ASGI 应用:
gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:80
-w 4 是 4 个 worker,-k uvicorn.workers.UvicornWorker 指定 worker 类型,-b 绑定地址端口。这种组合在老文档里很常见。
Note如今 Uvicorn 自己的
--workers已经能管理并重启死掉的 worker,所以并不一定需要 Gunicorn。新项目用fastapi run --workers N就够。Gunicorn 组合适合你已经在用它做进程管理、或需要它某些特性的场景。
48-8 启动、重启与守护
只手动跑一条命令,有个问题:你一断开服务器连接,进程可能就死;服务器重启后也不会自动拉起。生产部署需要:
- 开机自启:机器重启后应用自动起来
- 崩溃自重启:进程挂了自动拉起
这些通常由外部工具负责,比如 systemd、Supervisor,或容器平台的重启策略(下一章讲 Docker)。它们比「手动 nohup 一条命令」可靠得多。
Tip所谓「守护进程」思路,本质是让一个看门进程(systemd / Supervisor / 容器管理器)在后台一直盯着你的应用,没了就起、崩了就拉。不要自己手写死循环去保活。
48-9 跑前的准备步骤
有些事要在启动应用前做一次,比如数据库迁移。注意:只能由一个进程去做,否则多个 worker 并行跑迁移会互相冲突。通常让一个单独的步骤(或 init 容器)先跑完迁移,再启动多个 worker。简单应用没有这类前置步骤,可以跳过。
48-10 小结
FastAPI 是 ASGI 应用,由 Uvicorn 这类服务器跑起来。生产用 fastapi run(不要 dev 的热重载)。一个端口只能一个进程监听,多用 --workers N 开多进程并行,worker 数受 CPU 和内存限制。也可用 Gunicorn + UvicornWorker。开机自启和崩溃重启交给 systemd、Supervisor 或容器平台。