后端 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
、


浙公网安备 33010602011771号