用nssm部署FASTAPI服务

将开发完成的文件夹拷贝到了新windows服务器上。

1.Python安装 :新服务器上下载python,并安装,安装完成后检查一下

C:\Users\Administrator>python --version

Python 3.14.3

2.安装waitress.

C:\Users\Administrator>python -m pip install waitress

Collecting waitress

Downloading waitress-3.0.2-py3-none-any.whl.metadata (5.8 kB)

Downloading waitress-3.0.2-py3-none-any.whl (56 kB)

Installing collected packages: waitress

Successfully installed waitress-3.0.2

notice A new release of pip is available: 25.3 -> 26.0.1

notice To update, run: python.exe -m pip install --upgrade pip

其实main.py里面写的是:uvicorn.run(app, host="0.0.0.0", port=5200)。uvicorn本身就是生产级的 ASGI 服务器,比 waitress 更适合 FastAP,所以安装waitress就是多此一举。

3.配置nssm: 希望作为服务自启动,不要每次重启服务器都手工启动

下载nssm并解压缩到c:\

c:\nssm\win64>nssm install MESAPI

将里面的参数配置,按实际情况配置好。

Service "MESAPI" installed successfully!

4.启动服务器失败

c:\nssm\win64>nssm start mesapi

MESAPI: Unexpected status SERVICE_STOPPED in response to START control.

但是服务日志中并没有错误,直接运行python.

PS E:\MESAPI> python main.py

Traceback (most recent call last):

File "E:\MESAPI\main.py", line 1, in <module>

from fastapi import FastAPI, HTTPException, status, Depends

ModuleNotFoundError: No module named 'fastapi'

原来是新服务器上没有安装组件。

PS E:\MESAPI> pip install fastapi uvicorn pyodbc python-josecryptography passlibbcrypt python-multipart

安装成功后再执行:

PS E:\MESAPI> python main.py

INFO: Started server process 2588

INFO: Waiting for application startup.

INFO: Application startup complete.

INFO: Uvicorn running on http://0.0.0.0:5200 (Press CTRL+C to quit)

启动正常。

关闭后再试一次

C:\Users\Administrator>python e:\mesapi\main.py

32mINFO←\[0m: Started server process \[←\[36m8432←\[0m

←[32mINFO←[0m: Waiting for application startup.

←[32mINFO←[0m: Application startup complete.

←[32mINFO←[0m: Uvicorn running on ←[1mhttp://0.0.0.0:5200←[0m (Press CTRL+C to quit)

启动也正常,说明程序本身没有问题,nssm安装的服务无法启动,问题还是在nssm设置问题。
4.用nssm重新设置服务

c:\nssm\win64>nssm remove mesapi confirm --删除

c:\nssm\win64>nssm install MESAPI

这次把nssm要设置的参数都好好检查了一遍

Application Path: C:\Python310\python.exe

Arguments: e:\mesapi\main.py

Startup directory: e:\mesapi\

Details Display name : mesapi

Log on Account: Local System account

I/O Output (stdout) e:\mesapi\logs\stdout.log

Error (stderr) e:\mesapi\logs\stderr.log

设置完成后,启动服务,正常了!看来还是参数设置错误。
5.安装ODBC驱动

但是启动了,却无法访问,提示数据库链接错误。

{

"detail": "Database connection failed"

}

原因是缺少Microsoft ODBC Driver 18 for SQL Server (x64)

去微软网站:https://go.microsoft.com/fwlink/?linkid=2345415,下载安装。

安装后在用postman调用API,返回正确

{

"code": 200,

"data": {

"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhZG1pbiIsImV4cCI6MTc3Mzk3NzI0N30.dBZdCWMmnHoOe3v_larjOM2Dm1MsQ3EiyPIRNMZZ2A8"

},

"msg": "success"

}

6.POSTMAN测试API接口

虽然刚才用postman测试了一个API,但是为了验证,还是再测一下其它API接口

post http://192.168.10.15:5200/system/login

body 设置x-www-form-urlencoded

username:admin

password: adminpassword

post http://192.168.10.15:5200/system/sp/Menu

headers中添加:

authorization: Bearer (login返回的token)

content-Type: application/json

测试第二个接口就遇到新问题:

调用服务API,提示内部错误,但是直接运行python main.py,访问接口正常返回。

去日志stderr中找到了信息:

\encodings\cp1252.py", line 19, in encode

return codecs.charmap_encode(input,self.errors,encoding_table)0

~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

UnicodeEncodeError: 'charmap' codec can't encode characters in position 22-23: character maps to <undefined>

问了通义前问,告诉我原因是print输出中有中文字符,但 Windows 控制台默认编码(cp1252/cp936)无法处理。

处理方法是修改main.py

在文件最开头添加

import sys

import io

强制标准输出使用 UTF-8

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace')

sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8', errors='replace')

按建议修改后再次启动python main.py测试,遇到:

Errno 10048 error while attempting to bind on address ('0.0.0.0', 5200): winerror 10048 only one usage of each socket address (protocol/network address/port) is normally permitted

原因是服务状态是pending,端口被占用了。

停止服务,启动正常。

关闭测试,启动nssm安装的服务,再用postman测试API,接口都正常,部署完成。

相关推荐
我是一颗柠檬1 小时前
【MySQL全面教学】MySQL面试高频考点汇总Day15(2026年)
数据库·后端·mysql·面试
星空椰2 小时前
Python 面向对象高级:继承与类定义详解
开发语言·python
凯瑟琳.奥古斯特2 小时前
高阶子查询题目精炼
开发语言·数据库·python·职场和发展·数据库开发
身如柳絮随风扬2 小时前
数据库读写分离:从原理到实战,构建高并发系统
数据库·mysql
风之所往_2 小时前
Python 3.4 新特性全面总结
python
kaico20183 小时前
FastAPI 基础入门
fastapi
太阳上的雨天3 小时前
任何格式的文件转Markdown
python·ai
提笔了无痕3 小时前
RAG存储策略中.md格式的切片与存储怎么处理
数据库·ai·rag
yaoxin5211233 小时前
419. 现代 Java IO 最佳实践 - 写入文本文件
java·windows·python