Uvicorn默认前台阻塞运行,Windows生产环境必须用NSSM注册为系统服务以实现开机自启、崩溃自愈和日志集成;Path需填uvicorn.exe绝对路径,Arguments禁用--reload,须设--workers和正确Startup directory。

Uvicorn 本身不提供真正的“后台守护进程”能力,uvicorn 命令默认是前台阻塞式运行的;想让它长期稳定在后台运行,必须借助外部进程管理工具或操作系统级服务机制。
Windows 下用 NSSM 注册为系统服务(最稳)
这是 Windows 生产环境唯一推荐的方式,能实现开机自启、崩溃自动重启、日志集成等关键能力。
-
Path必须填uvicorn.exe的绝对路径,比如C:\myapp\venv\Scripts\uvicorn.exe—— 写成uvicorn或相对路径会失败 -
Arguments里不要加--reload,否则 NSSM 启动时会报错退出;正确写法是:main:app --host 0.0.0.0 --port 8000 --workers 4 -
Startup directory必须设为项目根目录(即main.py所在目录),否则找不到模块或配置文件 - 启动前先手动执行一遍命令,确认无
ImportError或Address already in use错误,再进 NSSM 配置
Linux/macOS 用 systemd 管理(标准做法)
systemd 是现代 Linux 发行版的事实标准,比 nohup 或 screen 更可靠,支持依赖管理、资源限制和健康检查。
Uvicorn 0.52.1 是 Python ASGI Web 服务器,提供异步应用服务及 WebSocket 支持,常用于 FastAPI、Starlette 等应用的开发和部署。本下载为官方 PyPI 通用 wheel 包,可使用 pip 安装,并由包管理器处理所需依赖。
- 服务文件(如
/etc/systemd/system/fastapi.service)中,WorkingDirectory和Environment必须显式声明,否则 Python 路径、虚拟环境和环境变量全失效 -
ExecStart应调用完整路径的uvicorn,例如:/opt/myapp/venv/bin/uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4 - 别忘了执行
sudo systemctl daemon-reload && sudo systemctl enable fastapi,否则 reboot 后不生效
通用陷阱:--reload 和 --workers 不能共存
很多人卡在这一步:想用 --reload 实现热重载,又想后台运行。这是不可能的 —— --reload 仅用于开发,且会禁用多进程(--workers 被忽略),同时要求前台交互式终端。
- 开发阶段:直接
uvicorn main:app --reload --host 0.0.0.0 --port 8000,别强求后台 - 测试/预发环境:去掉
--reload,用--workers+ systemd/NSSM 管理 - 如果真需要代码变更自动生效,应走 CI/CD 流程,而不是依赖
--reload
真正难的不是“怎么让它跑起来”,而是“怎么让它挂了还能自己拉起来、出错了有日志可查、端口冲突时明确报错而不是静默失败”。这些细节在 NSSM 或 systemd 配置里漏掉一项,就可能让服务上线后半夜掉线没人知道。

















