news 2026/6/10 1:23:12

python的fastapi+uvicorn的linux离线部署

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
python的fastapi+uvicorn的linux离线部署

一.导出依赖清单,将所有的包打到requirement.txt文件中

两种方式
1.整个环境的包都写进去,可能包含很多与项目无关的依赖
pip freeze > requirements.txt
只想记录项目真正用到的包,可以配合虚拟环境或使用pipreqs等工具
pip install pipreqs # 默认生成 requirements.txt pipreqs . # 如文件已存在,强制覆盖 pipreqs . --force

二、为 Python 3.11 下载兼容的离线包(关键步骤!)

下载离线包注意你生产环境的系统和python的版本号

pip download -r requirements.txt -d ./packages --only-binary=:all: --platform manylinux_2_17_x86_64 --python-version 311 --abi cp311

这条命令会把requirements.txt 里所有包的「manylinux_2_17_x86_64 + CPython-3.11 ABI二进制 wheel预先下载到./packages目录,不做安装,留给后续离线/容器化部署使用

命令含义
pip download仅拉包,不装包
-r requirements.txt按文件批量下载
-d ./packages保存目录(自动生成)
--only-binary=:all:
只要 wheel,不要源码 tar.gz;缺 wheel 就直接报错
--platform manylinux_2_17_x86_64wheel 标签:glibc≥2.17 的 64-bit Linux;不会下 win32/macOS 版本
--python-version 3113.11.x
--abi cp311CPython 3.11 ABI(与 PyPy/abi3 区分)

执行后./packages里会出现类似文件

numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.whl
uvloop-0.21.0-cp311-cp311-manylinux_2_17_x86_64.whl
...

没有.tar.gz,因此后续离线安装时无需编译,直接:

三、文件打包,上传服务器

将源代码+package目录打包上传到服务器,注意不要打包本地的环境目录/venv 目录

your_project/ ├── main.py # 你的应用主文件 ├── requirements.txt # 依赖清单 ├── packages/ # 存放所有.whl离线包的目录 └── ... # 其他项目文件

四、在服务器离线安装:

4.1 安装python环境,可以直接安装python3.11,也可以安装虚拟环境

4.2 使用本地包安装依赖

pip install --no-index --find-links=./packages -r requirements.txt

注意如果某个包没有打包到packages目录,类似以下出错:

出错ERROR: Could not find a version that satisfies the requirement uvloop>=0.15.1; (sys_platform != "win32" and (sys_platform != "cygwin" and platform_python_implementation != "PyPy")) and extra == "standard" (from uvicorn[standard]) (from versions: none)
ERROR: No matching distribution found for uvloop>=0.15.1; (sys_platform != "win32" and (sys_platform != "cygwin" and platform_python_implementation != "PyPy")) and extra == "standard"

如果服务器可以联网,可以直接下到packages目录中

pip3.11 download uvloop==0.21.0 -d ./packages

然后重新运行安装命令:

sudo pip3.11 install --no-index --find-links=./packages -r requirements.txt

4.3 运行程序

python3.11 -m uvicorn main:app --host 0.0.0.0 --port 8000

五、加一个系统启动脚本

#!/bin/bash # ------------------------------------------------------------ # Uvicorn 一键启停脚本(CentOS + Python3.11) # 放到项目根目录(/www/service)即可 # ------------------------------------------------------------ set -e APP_DIR="/www/service" PID_FILE="$APP_DIR/tool-service-uvicorn.pid" LOG_FILE="$APP_DIR/run.log" PYTHON="/usr/bin/python" # 改成你的 3.11 路径 HOST="0.0.0.0" PORT="9099" # 确保在项目根下 cd "$APP_DIR" # 获取 pid(若文件存在且进程存活) get_pid(){ [ -s "$PID_FILE" ] && echo $(cat "$PID_FILE") && return 0 return 1 } # 启动 start(){ if get_pid >/dev/null; then echo "uvicorn is already running ($(get_pid))" return 0 fi echo "Starting uvicorn ..." nohup $PYTHON -m uvicorn app:app --host $HOST --port $PORT \ --access-log --use-colors >> "$LOG_FILE" 2>&1 & echo $! > "$PID_FILE" echo "started, pid=$(get_pid)" } # 停止 stop(){ PID=$(get_pid) || { echo "uvicorn not running"; return 0; } echo "Stopping uvicorn ($PID) ..." kill -TERM "$PID" for i in {1..10}; do kill -0 "$PID" >/dev/null 2>&1 || { rm -f "$PID_FILE"; echo "stopped"; return 0; } sleep 1 done echo "force kill ..." kill -9 "$PID" && rm -f "$PID_FILE" } # 重启 restart(){ stop sleep 1 start } # 状态 status(){ PID=$(get_pid) && echo "uvicorn is running, pid=$PID" || echo "uvicorn is stopped" } # 路由 case "$1" in start) start ;; stop) stop ;; restart) restart ;; status) status ;; *) echo "Usage: $0 {start|stop|restart|status}"; exit 1 ;; esac

操作命令

./uvicorn.sh start # 后台启动 ./uvicorn.sh stop # 优雅停止 ./uvicorn.sh restart # 先停后启 ./uvicorn.sh status # 查看运行状态 tail -f run.log # 实时日志
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 14:53:06

Java_类的加载

基本说明:反射机制是java实现动态语言的关键,也就是通过反射实现类动态加载1.静态加载:编译时加载相关的类,如果没有则报错,依赖性太强2.动态加载:运行时加载需要的类,如果运行时不用该类,即使不存在该类,也不会报错,降低了依赖性类加载时机:1.当创建对象时(new)2.当子类被加载…

作者头像 李华
网站建设 2026/6/9 17:29:44

LobeChat生成PPT大纲效率提升三倍的秘密

LobeChat生成PPT大纲效率提升三倍的秘密 在企业日常办公中,一份结构清晰、逻辑严谨的PPT往往意味着数小时甚至更久的资料整理与内容重构。尤其是面对项目汇报、产品发布或战略复盘这类高要求场景时,不仅要整合多份文档,还需确保表达方式符合专…

作者头像 李华
网站建设 2026/6/10 14:52:06

LobeChat调用Function Calling的完整示例

LobeChat 调用 Function Calling 的完整实践 在构建现代 AI 应用的今天,一个核心挑战是:如何让大语言模型不只是“能说”,还能“会做”?用户不再满足于听到一段漂亮的回答,而是期待系统能真正完成任务——比如查天气、…

作者头像 李华
网站建设 2026/6/10 10:49:34

4、创建交互式脚本

创建交互式脚本 1. 使用带选项的 echo 命令 echo 命令非常实用,在很多脚本中都会用到。运行 echo 命令时,默认使用内置命令,除非指定文件的完整路径,可通过以下命令测试: $ which echo若想获取内置命令的帮助,可使用 man bash 并搜索 echo,但 echo 命令与内部命令…

作者头像 李华
网站建设 2026/6/9 23:12:16

6、深入探索脚本编程:条件语句与代码片段的高效运用

深入探索脚本编程:条件语句与代码片段的高效运用 在脚本编程的世界里,条件语句和代码片段是提升效率和增强脚本功能的关键要素。下面将详细介绍条件语句的使用方法以及如何创建和利用代码片段来简化脚本编写过程。 1. 条件语句的运用 1.1 文件和目录检查 在脚本中,我们常…

作者头像 李华
网站建设 2026/6/9 20:25:11

7、代码片段创建与替代语法使用指南

代码片段创建与替代语法使用指南 1. 代码片段创建 在脚本编写中,我们可以通过彩色输出轻松识别脚本的成功与失败。例如,当提供参数时会显示绿色输出,而未提供所需名称时则会显示红色的使用说明。对于喜欢图形化集成开发环境(IDE)的人来说,可以使用VS Code作为shell脚本的…

作者头像 李华