如何使用Supervisor管理Uvicorn进程

大萱君_3833

大萱君_3833

2026-11-05

842人浏览

原创

Supervisor 必须直接 fork/exec 启动 Uvicorn 单进程(--workers 1),禁用所有后台化逻辑,否则会托管 shell 而非实际进程,导致控制失效、日志丢失;配置需指定绝对路径、正确用户权限、killasgroup=true 和 stopsignal=TERM,并通过 numprocs 实现水平扩展。

如何使用supervisor管理uvicorn进程

Supervisor 能管住 Uvicorn,但必须绕开它的 daemon 模式和多进程陷阱——否则进程会失控、日志丢失、重启失败。

为什么不能直接用 uvicorn --daemon 配合 Supervisor?

Uvicorn 本身不支持 --daemon 参数(加了会报错 unrecognized arguments: --daemon),但有人误套用 Gunicorn 习惯,用 nohup 或 & 包裹它再丢给 Supervisor,结果是:Supervisor 管的不是 uvicorn 主进程,而是 shell,导致 supervisorctl stop 失效、autorestart 不触发、日志全丢。

  • Uvicorn 进程必须由 Supervisor 直接 fork/exec 启动,不能间接托管
  • 禁用任何后台化逻辑:删掉 nohup、&、screen,也不要用 systemd 的 Type=forking
  • 确保 command= 指向的是可执行文件绝对路径,比如 /opt/venv/bin/uvicorn,不是 uvicorn(避免 PATH 依赖)

supervisord.conf 里怎么写 Uvicorn 的 program 配置?

关键在三点:用 --workers 1(禁用 uvicorn 自身多进程)、关掉所有信号拦截、把日志收归 Supervisor 管理。以下是最简可用模板:

[program:myapp]
command=/opt/venv/bin/uvicorn --workers 1 --host 0.0.0.0 --port 8000 main:app
directory=/opt/myapp
user=www-data
autostart=true
autorestart=true
startretries=3
redirect_stderr=true
stdout_logfile=/var/log/myapp/access.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=5
stopwaitsecs=10
killasgroup=true
stopsignal=TERM
  • --workers 1:强制单 worker,让 Supervisor 控制横向扩展(多实例靠 numprocs,不是 uvicorn 内置)
  • killasgroup=true + stopsignal=TERM:确保 Ctrl+C 或 stop 命令能真正终止 uvicorn 及其子线程(比如 asyncio 任务)
  • 不要用 --uds(Unix socket)除非你明确需要 Nginx 代理到 socket;用 --host/--port 更直白、调试方便
  • user= 必须存在且有权限读代码、写日志,别设成 root

启动后 supervisorctl status 显示 STARTING 或 FATAL 怎么办?

常见原因就三个:路径错、权限错、Python 环境错。先看日志:

Uvicorn 0.52.1
Uvicorn 0.52.1

Uvicorn 0.52.1 是 Python ASGI Web 服务器,提供异步应用服务及 WebSocket 支持,常用于 FastAPI、Starlette 等应用的开发和部署。本下载为官方 PyPI 通用 wheel 包,可使用 pip 安装,并由包管理器处理所需依赖。

下载
  • 运行 supervisorctl tail myapp stderr,不是翻 /var/log/supervisor/supervisord.log
  • 如果报 ModuleNotFoundError:确认 directory= 正确,并在 command 中用虚拟环境里的 uvicorn,而非系统全局的
  • 如果报 Permission denied:检查 user= 对应用户是否能读 main.py、写 access.log 所在目录
  • 如果卡在 STARTING 超过 10 秒:可能是端口被占,换 --port 8001 测试;或 uvicorn 启动时加载模型太慢,调大 startsecs=30

想水平扩展多个 Uvicorn 实例,该用 numprocs 还是 --workers?

用 numprocs,别碰 --workers。Uvicorn 的 --workers 是 spawn 模式,每个 worker 是独立 Python 进程,共享不了 asyncio event loop,反而容易引发资源竞争(比如多个 worker 同时写同一个 SQLite 文件)。而 Supervisor 的 numprocs 是真正隔离的进程组,配合 Nginx upstream 能做健康探活和负载分发。

  • 正确做法:numprocs=4 + process_name=myapp-%(process_num)02d + Nginx 配置 upstream 指向 127.0.0.1:8000 ~ 127.0.0.1:8003
  • 错误做法:留 --workers 4,但 numprocs=1 —— 这样 Supervisor 只监控一个主进程,worker 崩溃了它根本不知道
  • 注意:每个实例要绑定不同端口,或改用 --fd 0 + Unix socket(需配合 socket_type=stream 和 serverurl=unix:///var/run/supervisor.sock)

最易被忽略的一点:Supervisor 不会自动 reload 配置变更,哪怕你改了 ini 文件。每次改完必须手动 supervisorctl reread && supervisorctl update,否则新配置永远不生效——这个动作比重启 supervisord 安全得多,也快得多。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

uvicorn

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

2026.11.05

0

12

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

2026.11.05

0

12

DBeaver连接创建与配置教程
DBeaver连接创建与配置教程

本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。

2026.11.04

0

16

XORM框架结构体映射与表结构同步
XORM框架结构体映射与表结构同步

本专题围绕XORM框架的结构体映射展开,说明表名与字段的命名策略、xorm标签常用属性、主键自增与时间字段自动填充,并演示Sync2自动建表、增量字段升级、索引声明与反向生成结构体的完整流程。

2026.11.04

0

15

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

2026.11.04

0

15

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

2026.11.04

0

16

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

2026.11.04

0

16

XORM框架零基础入门教程
XORM框架零基础入门教程

本专题梳理XORM框架的入门路径,从框架定位、依赖安装、连接数据库到跑通第一个增删改查示例,讲清Engine初始化、日志开启与项目目录规划,并对比GORM等同类ORM的差异,帮助Go开发者建立整体认知。

2026.11.04

0

15

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

2026.11.03

20

18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方部署指南
Uvicorn官方部署指南

共0课时 | 0人学习

Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习