Administrator
Administrator
发布于 2025-12-24 / 2 阅读

在 Windows Server 上部署 python后端服务(FastAPI为例)

方案一:NSSM 注册为 Windows 服务 (最推荐,简单稳定)

NSSM (Non-Sucking Service Manager) 是一个非常流行的工具,可以将任何 .exe (包括 python.exe) 封装成 Windows 服务。

优点

  • 开机自启:Windows 启动时自动运行。
  • 崩溃重启:如果 Python 进程挂了,服务会自动拉起它。
  • 后台运行:没有烦人的 CMD 黑窗口。

操作步骤

  1. 准备启动命令
    不要在代码里写 uvicorn.run(...)。请确保你安装了 uvicorn:

    pip install uvicorn
    

    测试命令能否运行(假设你的入口文件是 app.py,FastAPI 实例叫 app):

    # 生产环境建议指定 host 和 port
    uvicorn app:app --host 0.0.0.0 --port 8000
    
  2. 下载 NSSM
    NSSM 官网 下载最新版(通常用 win64 文件夹下的 nssm.exe),将其解压到一个固定目录(例如 C:\tools\nssm.exe),并将该目录加入环境变量 PATH。

  3. 安装服务
    管理员身份打开 CMD 或 PowerShell,运行:

    nssm install MyFastApiService
    
  4. 配置参数 (在弹出的 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)

  5. 启动服务
    点击 "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 管理)

操作步骤

  1. 按照 方案一,配置 NSSM 服务,但将 uvicorn 的 host 改为 127.0.0.1 (仅限本机访问)。
  2. 在 Windows Server 上启用 IIS
  3. 安装 IIS URL Rewrite 模块和 Application Request Routing (ARR) 模块(微软官网下载)。
  4. 在 ARR 设置中启用 "Enable proxy"。
  5. 在 IIS 中添加一个新网站,指向一个空文件夹即可。
  6. 配置该网站的 URL Rewrite 规则,将所有流量转发到 http://127.0.0.1:8000

优点

  • 由 IIS 统一管理 SSL 证书。
  • 静态文件(图片、CSS)可以由 IIS 处理,减轻 Python 压力。
  • 端口复用(多个服务共用 80 端口)。

方案三:Docker Desktop (现代化做法)

如果你的服务器支持虚拟化(Hyper-V),使用 Docker 是最容易迁移和管理的方案。

操作步骤

  1. 编写 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"]
    
  2. 构建并启动

    docker build -t my-fastapi-app .
    # --restart always 确保开机自启和崩溃重启
    docker run -d -p 8000:8000 --name myapi --restart always my-fastapi-app
    

优点

  • 环境隔离,不用担心服务器上的 Python 版本冲突。
  • 部署极其方便,一行命令搞定。

总结建议

  1. 如果只是内部使用简单部署:请使用 方案一 (NSSM)。这是 Windows 上最稳健、最简单的“原生”做法。
  2. 如果要对外发布需要 HTTPS:请使用 方案二 (IIS + NSSM)
  3. 如果你熟悉容器技术:请使用 方案三 (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)