用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 \ from fastapi import FastAPI, HTTPException, status, Depends ModuleNotFoundError: No module named 'fastapi' 原来是新服务器上没有安装组件。 PS E:\\MESAPI\> pip install fastapi uvicorn pyodbc python-jose\[cryptography\] passlib\[bcrypt\] 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,接口都正常,部署完成。

相关推荐
Dxy123931021623 分钟前
Python Pillow库:`img.format`与`img.mode`的区别详解
开发语言·python·pillow
zhangshuang-peta30 分钟前
MCP + OpenClaw:执行框架如何被“约束成系统”
数据库·人工智能·ai·ai agent·mcp·peta
java1234_小锋36 分钟前
说一下Spring的事务传播行为?
java·数据库·spring
苏三说技术40 分钟前
美团二面:高并发下如何保证接口幂等性?
java·数据库
༒࿈南林࿈༒1 小时前
刺猬猫小说下载
python·js逆向
精益数智小屋1 小时前
设备维护方案核心功能拆解:一套好的设备维护方案如何解决设备突发故障
大数据·运维·网络·数据库·人工智能·面试·自动化
.柒宇.1 小时前
AI-Agent入门实战-AI私厨
人工智能·python·langchain·agent·fastapi
默子昂1 小时前
langchain 基本使用
开发语言·python·langchain
SilentSamsara1 小时前
生成器实战:处理大文件、流水线模式与无限序列
vscode·python·青少年编程·pycharm
phltxy1 小时前
Redis 常见数据类型之全局通用命令详解
数据库·redis·bootstrap