后端 Python 重新发布指南(nohup 启动方式)

 

https://www.cnblogs.com/wochunyang/articles/23166554

https://www.cnblogs.com/wochunyang/articles/23166419

 

本文档适用于以 nohup + uvicorn 绝对路径 方式运行后端的场景。 完整初次部署请见 deploy-centos7.md。 本文档只聚焦「代码更新后如何重新发布」。

一、前置约定

 

项值
代码目录 /workspase/python/ai_demo/app
后端目录 /workspase/python/ai_demo/app/backend
venv 目录 /workspase/python/ai_demo/app/venv
uvicorn 路径 /workspase/python/ai_demo/app/venv/bin/uvicorn
监听端口 8000
启动方式 nohup 后台 + 绝对路径
日志文件 /workspase/python/ai_demo/app/backend/uvicorn.log
Git 主分支 dev(不是 master)

二、标准重新发布流程

2.1 完整升级(拉代码 + 重启)

# 1. 拉取最新代码
cd /workspase/python/ai_demo/app
git pull origin dev
# 2. 杀掉旧进程(按启动命令匹配,精确杀死)
pkill -f "uvicorn app.main:app"
# 等待进程退出
sleep 2
# 3. 用绝对路径重新拉起(不依赖 venv 是否激活)
cd /workspase/python/ai_demo/app/backend
nohup /workspase/python/ai_demo/app/venv/bin/uvicorn app.main:app --host 0.0.0.0 --port 8000 > uvicorn.log 2>&1 &
# 4. 验证启动
sleep 2
curl http://127.0.0.1:8000/health
tail -30 /workspase/python/ai_demo/app/backend/uvicorn.log

  

2.2 最简流程(只改代码,没动依赖)

cd /workspase/python/ai_demo/app && git pull origin dev
pkill -f "uvicorn app.main:app"
sleep 2
cd /workspase/python/ai_demo/app/backend
nohup /workspase/python/ai_demo/app/venv/bin/uvicorn app.main:app --host 0.0.0.0 --port 8000 > uvicorn.log 2>&1 &
sleep 2 && curl http://127.0.0.1:8000/health

  

2.3 仅重启服务(不拉代码)

pkill -f "uvicorn app.main:app"
sleep 2
cd /workspase/python/ai_demo/app/backend
nohup /workspase/python/ai_demo/app/venv/bin/uvicorn app.main:app --host 0.0.0.0 --port 8000 > uvicorn.log 2>&1 &

  

2.4 含依赖更新 + 数据库变更(升级依赖或表结构时)

# 1. 拉代码
cd /workspase/python/ai_demo/app
git pull origin dev
# 2. 更新依赖(requirements.txt 有变更时)
cd backend
source ../venv/bin/activate
pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
deactivate
# 3. 数据库变更(如有 migration 脚本,按需执行)
mysql -uai_worker -p'Ai@2026work!' ai_demo < /workspase/python/ai_demo/app/database/migrations/xxx.sql
# 4. 重启
pkill -f "uvicorn app.main:app"
sleep 2
nohup /workspase/python/ai_demo/app/venv/bin/uvicorn app.main:app --host 0.0.0.0 --port 8000 > uvicorn.log 2>&1 &
# 5. 验证
sleep 2
curl http://127.0.0.1:8000/health
tail -30 uvicorn.log

  

三、状态检查

# 确认进程在跑
ps -ef | grep uvicorn | grep -v grep
# 确认端口监听
ss -tlnp | grep 8000
# 或
netstat -tlnp | grep 8000
# 健康检查
curl http://127.0.0.1:8000/health
# 期望: {"status":"healthy",...}
# 看日志
tail -50 /workspase/python/ai_demo/app/backend/uvicorn.log
# 实时跟踪日志
tail -f /workspase/python/ai_demo/app/backend/uvicorn.log

  

四、常见问题排查

4.1 启动后立刻退出(退出码 127)

现象:

[1]+  退出 127    nohup uvicorn app.main:app ...

  

原因:退出码 127 = 命令没找到。直接用 uvicorn 而当前 shell 没激活 venv,PATH 里找不到。 解决:必须用 venv 绝对路径(本指南所有命令都用绝对路径):

nohup /workspase/python/ai_demo/app/venv/bin/uvicorn app.main:app --host 0.0.0.0 --port 8000 > uvicorn.log 2>&1 &

  

确认 uvicorn 存在:

ls -la /workspase/python/ai_demo/app/venv/bin/uvicorn

  

4.2 端口被占用(启动失败 /bind error)

# 查谁占了 8000
ss -tlnp | grep 8000
# 或
lsof -i:8000
# 杀掉占用进程
kill $(lsof -t -i:8000)
# 然后重新拉起

  

4.3 ModuleNotFoundError: No module named 'app'

原因:启动时当前目录不是 backend/,uvicorn 找不到 app 包。 解决:启动前确保 cd 到 backend:

cd /workspase/python/ai_demo/app/backend
nohup /workspase/python/ai_demo/app/venv/bin/uvicorn app.main:app ...

  

4.4 uvicorn 根本没装

# 检查
/workspase/python/ai_demo/app/venv/bin/python -c "import uvicorn; print('uvicorn OK')"
# 没装则补装
cd /workspase/python/ai_demo/app/backend
source ../venv/bin/activate
pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/

  

4.5 停止服务

# 按命令匹配杀
pkill -f "uvicorn app.main:app"
# 按端口杀
kill $(lsof -t -i:8000)
# 确认已停
ps -ef | grep uvicorn | grep -v grep   # 无输出即已停

  

五、安全说明

 

项说明
进程管理 nohup 方式重启服务器后不会自动拉起,生产建议改用 systemd(见 deploy-centos7.md §8)
日志位置 backend/uvicorn.log(相对路径,落在 backend 目录下);日志会持续增长,需定期清理或 logrotate
多实例 当前单实例;如需多 worker,命令加 --workers 4(但无反向代理时单实例足够)
.env 安全 .env 在 .gitignore,git pull 不会覆盖生产配置

六、一键发布脚本(可选)

可将以下内容保存为 /workspase/python/ai_demo/app/scripts/redeploy.sh,以后直接 bash redeploy.sh 即可:

#!/bin/bash
set -e
APP_DIR=/workspase/python/ai_demo/app
BACKEND_DIR=$APP_DIR/backend
VENV_UVICORN=$APP_DIR/venv/bin/uvicorn
LOG=$BACKEND_DIR/uvicorn.log
echo "[1/4] 拉取最新代码 (dev)..."
cd $APP_DIR
git pull origin dev
echo "[2/4] 停止旧进程..."
pkill -f "uvicorn app.main:app" 2>/dev/null || true
sleep 2
echo "[3/4] 启动新进程..."
cd $BACKEND_DIR
nohup $VENV_UVICORN app.main:app --host 0.0.0.0 --port 8000 > $LOG 2>&1 &
sleep 2
echo "[4/4] 健康检查..."
curl -s http://127.0.0.1:8000/health || echo "⚠️ 健康检查失败,请查看 $LOG"
echo "最近日志:"
tail -10 $LOG

  

赋权后使用:

chmod +x /workspase/python/ai_demo/app/scripts/redeploy.sh
bash /workspase/python/ai_demo/app/scripts/redeploy.sh

  

、

 

微信图片_20260323111802_84_204

 

posted @ 2026-10-09 11:23  程序员食堂  阅读(15)  评论(0)    收藏  举报