fastapi:fastapi项目的线上部署,gunicorn和supervisor分别起了什么作用?
在生产环境中,不建议直接运行 uvicorn main:app,因为一旦程序崩溃不会自动重启,且无法利用多核 CPU。所以我们使用 Gunicorn 来管理 Uvicorn。
在 FastAPI 项目的线上部署中,Gunicorn 和 Supervisor 扮演着完全不同的角色,它们的分工极其明确。
简单来说:Gunicorn 负责管理 Python 进程和处理网络请求,而 Supervisor 负责管理 Gunicorn 这个软件本身(防止它挂掉)。
虽然它们都带有“管理”两个字,但它们的作用几乎没有重合。
1. Gunicorn 起到了什么作用?(应用级管理)
Gunicorn 是一个 WSGI HTTP 服务器,在 FastAPI 部署中,它通常作为进程管理器,结合 Uvicorn(ASGI 服务器)来工作。
- 进程多开(多核利用):Python 有 GIL(全局解释器锁),单进程只能用一个 CPU 核心。Gunicorn 可以根据你的 CPU 核心数,启动多个 Worker 进程(例如 4 个进程),让 FastAPI 具备并发处理多个请求的能力。
- 请求分发与负载均衡:当 Nginx 把用户请求转过来时,Gunicorn 负责把请求均匀地分发给它下面的各个 Uvicorn 进程。
- 热加载与优雅重启:当你修改了代码,Gunicorn 可以在不中断用户请求的情况下,逐个重启 Worker 进程完成平滑升级。
- 死锁与超时处理:如果某个 Worker 进程因为死循环或内存泄露卡死了,Gunicorn 会在达到超时时间(timeout)后自动杀掉它,并立刻启动一个新的进程来顶替。
2. Supervisor 起到了什么作用?(系统级守护)
Supervisor 是一个进程控制系统。它是一个后台守护进程,专门用来监视和管理操作系统中的各种服务。
- 开机自启:当服务器重启后,Supervisor 会自动运行,并把你配置好的 Gunicorn 自动拉起来。
- 自动死服拉起(最核心功能):如果 Gunicorn 因为服务器内存不足(OOM)、系统错误或被人误删进程而彻底崩溃,Supervisor 会在几毫秒内发现,并重新执行启动命令,确保服务不间断。
- 日志收集:它能统一接管 Gunicorn 的标准输出(stdout)和错误输出(stderr),自动把日志写入你指定的文件夹,方便排查由于启动失败导致的闪退。
- 后台化运行:让 Gunicorn 乖乖在后台运行,不需要你登录 SSH 去手动敲命令,也不用担心关闭终端窗口后程序退出的问题。
3. 两者的作用有重合吗?
没有重合,它们是上下级的“套娃”监护关系。
我们可以用一个职场结构来比喻:
- FastAPI 代码是普通员工,负责真正干活(处理业务逻辑)。
- Gunicorn 是项目经理。他手下管着好几个员工(Worker)。如果某个员工(Worker)生病倒下了,经理会开除他并招个新员工(拉起新进程)。但项目经理也是人,如果突然遇到了毁灭性打击,经理自己也可能会“猝死”。
- Supervisor 是公司老板。老板不直接管员工干活,他只盯着项目经理(Gunicorn)。只要项目经理不见了或者撂挑子不干了,老板就会立刻指派(拉起)一个新的项目经理上岗。
为什么不能只用其中一个?
- 只用 Gunicorn,不用 Supervisor:当你的服务器因为某种原因重启,或者 Gunicorn 自身因为严重 Bug 彻底崩溃时,你的网站就会直接瘫痪,直到你手动登录服务器去重新启动它。
- 只用 Supervisor,不用 Gunicorn:Supervisor 只能直接去跑
uvicorn main:app。这样你就只能启动一个单进程的 FastAPI 实例,无法利用多核 CPU,一旦高并发请求进来,网站就会变得极慢。
📊 现代 FastAPI 部署的黄金组合标准流程
在实际生产环境中,通常是这四层架构协同作业:
用户请求 ➡️ Nginx (动静分离/安全防护) ➡️ Supervisor (守护进程) ➡️ Gunicorn (利用多核管理 Uvicorn) ➡️ FastAPI (业务逻辑)
浙公网安备 33010602011771号