Uvicorn不支持--daemon参数,因其定位为轻量级ASGI服务器,进程管理交由systemd、supervisord或Gunicorn等工具;推荐用Gunicorn+UvicornWorker、nohup+&或systemd服务单元实现后台运行。

Uvicorn 本身不支持后台运行,直接加 --daemon 会报错;必须借助外部工具或换用 Gunicorn。
为什么 uvicorn --daemon 不工作
Uvicorn 的命令行接口压根没实现 --daemon 参数。你执行 uvicorn main:app --daemon 会看到 unrecognized arguments: --daemon。这不是遗漏,而是设计选择:Uvicorn 定位是轻量级 ASGI 服务器,进程管理交给更成熟的工具(如 systemd、supervisord 或 Gunicorn)。
真正可用的后台启动方式
以下三种方案按推荐顺序排列,都经过生产验证:
Uvicorn 0.52.1 是 Python ASGI Web 服务器,提供异步应用服务及 WebSocket 支持,常用于 FastAPI、Starlette 等应用的开发和部署。本下载为官方 PyPI 通用 wheel 包,可使用 pip 安装,并由包管理器处理所需依赖。
- 用
gunicorn+uvicorn.workers.UvicornWorker:最稳妥,自带日志重定向、worker 管理、信号处理
命令示例:gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000 --daemon --access-logfile access.log --error-logfile error.log - 用
nohup+&:适合临时调试或 CI 环境,但无法优雅重启、日志轮转需手动处理
命令示例:nohup uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4 > uvicorn.log 2>&1 & - 用
systemd服务单元:Linux 生产环境首选,支持开机自启、崩溃自动拉起、资源限制
关键配置项:Type=simple、Restart=on-failure、StandardOutput=journal、Environment="PYTHONPATH=/path/to/your/app"
容易被忽略的静默陷阱
即使加了 --daemon 或 nohup,以下几点仍会导致“看似后台、实则失败”:
-
uvicorn启动时若遇到ImportError或Address already in use,会直接退出,但nohup默认不把 stderr 写进日志——你根本看不到错误;务必显式重定向2>&1 - 用
gunicorn时漏写-k uvicorn.workers.UvicornWorker,它会默认起同步 worker,所有async def路由都会报TypeError: 'coroutine' object is not callable - 在容器中运行时,
nohup或gunicorn --daemon会让主进程变成后台,违反容器“前台进程守则”,导致docker run立即退出;必须用exec或 systemd 替代
真正静默 ≠ 彻底消失,而是错误可查、状态可控。别为了“看不见”牺牲可观测性——把 accesslog 和 errorlog 指向明确路径,比藏起来更重要。










