用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,接口都正常,部署完成。

相关推荐
Meepo_haha1 天前
配置 Redis
数据库·redis·缓存
u0109147601 天前
CSS组件库如何快速扩展_通过Sass @extend继承基础布局
jvm·数据库·python
baidu_340998821 天前
Golang怎么用go-noescape优化性能_Golang如何使用编译器指令控制逃逸分析行为【进阶】
jvm·数据库·python
m0_678485451 天前
如何利用虚拟 DOM 实现无痕刷新?基于 VNode 对比的状态保持技巧
jvm·数据库·python
qq_342295821 天前
CSS如何实现透明背景效果_通过RGBA色彩模式控制透明度
jvm·数据库·python
TechWayfarer1 天前
知乎/微博的IP属地显示为什么偶尔错误?用IP归属地查询平台自检工具3步验证
网络·python·网络协议·tcp/ip·网络安全
panzer_maus1 天前
MySQL 索引介绍与索引优化的简单介绍
数据库·mysql
Greyson11 天前
CSS如何处理超长文本换行问题_结合word-wrap属性
jvm·数据库·python
captain3761 天前
事务___
java·数据库·mysql
justjinji1 天前
如何批量更新SQL数据表_使用UPDATE JOIN语法提升效率
jvm·数据库·python