方案一:NSSM 注册为 Windows 服务 (最推荐,简单稳定)
NSSM (Non-Sucking Service Manager) 是一个非常流行的工具,可以将任何 .exe (包括 python.exe) 封装成 Windows 服务。
优点:
- 开机自启:Windows 启动时自动运行。
- 崩溃重启:如果 Python 进程挂了,服务会自动拉起它。
- 后台运行:没有烦人的 CMD 黑窗口。
操作步骤:
-
准备启动命令:
不要在代码里写uvicorn.run(...)。请确保你安装了 uvicorn:pip install uvicorn测试命令能否运行(假设你的入口文件是
app.py,FastAPI 实例叫app):# 生产环境建议指定 host 和 port uvicorn app:app --host 0.0.0.0 --port 8000 -
下载 NSSM:
去 NSSM 官网 下载最新版(通常用 win64 文件夹下的 nssm.exe),将其解压到一个固定目录(例如C:\tools\nssm.exe),并将该目录加入环境变量 PATH。 -
安装服务:
以管理员身份打开 CMD 或 PowerShell,运行:nssm install MyFastApiService -
配置参数 (在弹出的 GUI 窗口中填入):
-
Path: 选择你的 Python 解释器路径 (例如
C:\Python39\python.exe或虚拟环境下的python.exe)。 -
Startup directory: 你的项目代码根目录 (例如
C:\Projects\MyApp). -
Arguments: 填入 uvicorn 的启动参数,注意要把
uvicorn换成模块调用方式-m uvicorn:-m uvicorn app:app --host 0.0.0.0 --port 8000 --workers 4(注意:
--workers 4表示开启4个进程,利用多核 CPU)
-
-
启动服务:
点击 "Install service" 后,在 CMD 中运行:nssm start MyFastApiService
现在,你的 FastAPI 就变成了 Windows 服务,可以在“任务管理器 -> 服务”中看到,并且开机自启、崩溃重启。
方案二:IIS 反向代理 + NSSM (企业级做法)
如果你需要通过域名访问(如 api.yourdomain.com),或者需要配置 SSL (HTTPS),或者服务器上还跑着其他网站,建议结合 IIS 使用。
架构:
公网 (80/443) -> IIS (反向代理) -> 本地 (127.0.0.1:8000) -> Uvicorn (由 NSSM 管理)
操作步骤:
- 按照 方案一,配置 NSSM 服务,但将 uvicorn 的 host 改为
127.0.0.1(仅限本机访问)。 - 在 Windows Server 上启用 IIS。
- 安装 IIS URL Rewrite 模块和 Application Request Routing (ARR) 模块(微软官网下载)。
- 在 ARR 设置中启用 "Enable proxy"。
- 在 IIS 中添加一个新网站,指向一个空文件夹即可。
- 配置该网站的 URL Rewrite 规则,将所有流量转发到
http://127.0.0.1:8000。
优点:
- 由 IIS 统一管理 SSL 证书。
- 静态文件(图片、CSS)可以由 IIS 处理,减轻 Python 压力。
- 端口复用(多个服务共用 80 端口)。
方案三:Docker Desktop (现代化做法)
如果你的服务器支持虚拟化(Hyper-V),使用 Docker 是最容易迁移和管理的方案。
操作步骤:
-
编写 Dockerfile (在项目根目录):
FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . # 启动命令 CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"] -
构建并启动:
docker build -t my-fastapi-app . # --restart always 确保开机自启和崩溃重启 docker run -d -p 8000:8000 --name myapi --restart always my-fastapi-app
优点:
- 环境隔离,不用担心服务器上的 Python 版本冲突。
- 部署极其方便,一行命令搞定。
总结建议
- 如果只是内部使用或简单部署:请使用 方案一 (NSSM)。这是 Windows 上最稳健、最简单的“原生”做法。
- 如果要对外发布或需要 HTTPS:请使用 方案二 (IIS + NSSM)。
- 如果你熟悉容器技术:请使用 方案三 (Docker)。
额外提示:代码中的修改
在生产环境中,请将 app.py 底部的启动代码去掉或加上判断,不要让代码自动运行开发服务器:
# app.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
# 生产环境通常不需要这段,或者确保只在直接运行时触发
if __name__ == "__main__":
import uvicorn
# 仅供开发调试使用
uvicorn.run("app:app", host="0.0.0.0", port=8000, reload=True)