292 lines
5.7 KiB
Markdown
292 lines
5.7 KiB
Markdown
|
|
# 后端服务守护进程配置指南
|
|||
|
|
|
|||
|
|
**配置时间**: 2026-03-14
|
|||
|
|
**版本**: v2.7.4
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔍 后端不稳定原因分析
|
|||
|
|
|
|||
|
|
### 可能原因
|
|||
|
|
|
|||
|
|
1. **手动启动无守护** - 之前使用 `nohup` 但没有监控
|
|||
|
|
2. **服务器重启** - 服务器重启后需要手动启动
|
|||
|
|
3. **内存不足** - 检查发现内存充足 (3.5GB 可用 1.5GB)
|
|||
|
|
4. **磁盘空间** - 检查发现磁盘充足 (49GB 可用 31GB)
|
|||
|
|
5. **进程意外终止** - 可能因系统资源调度被 kill
|
|||
|
|
|
|||
|
|
### 日志分析
|
|||
|
|
|
|||
|
|
检查 `/tmp/zodiac-backend.log` 发现:
|
|||
|
|
- ✅ 没有 Python 异常
|
|||
|
|
- ✅ 没有内存溢出
|
|||
|
|
- ✅ 没有数据库连接错误
|
|||
|
|
- ✅ 服务正常运行直到意外停止
|
|||
|
|
|
|||
|
|
**结论**: 进程缺少守护机制,意外停止后无法自动恢复
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ✅ 解决方案:双重守护
|
|||
|
|
|
|||
|
|
### 方案 1: 启动脚本 + Crontab 监控(已配置)
|
|||
|
|
|
|||
|
|
**启动脚本**: `/home/admin/.openclaw/workspace/zodiac-collector/backend-fastapi/start.sh`
|
|||
|
|
|
|||
|
|
**功能**:
|
|||
|
|
- ✅ 检查进程是否已在运行
|
|||
|
|
- ✅ 停止旧进程
|
|||
|
|
- ✅ 启动新进程
|
|||
|
|
- ✅ 保存 PID 到文件
|
|||
|
|
- ✅ 验证启动是否成功
|
|||
|
|
|
|||
|
|
**Crontab 监控**: 每 2 分钟检查一次
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
*/2 * * * * if ! ps aux | grep -v grep | grep 'uvicorn app.main:app' > /dev/null; then
|
|||
|
|
/home/admin/.openclaw/workspace/zodiac-collector/backend-fastapi/start.sh >> /tmp/backend-watch.log 2>&1;
|
|||
|
|
fi
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**优点**:
|
|||
|
|
- 简单可靠
|
|||
|
|
- 自动恢复
|
|||
|
|
- 日志记录
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 方案 2: systemd 服务(备选)
|
|||
|
|
|
|||
|
|
如果 crontab 方案不可靠,可以使用 systemd:
|
|||
|
|
|
|||
|
|
**服务文件**: `/etc/systemd/system/zodiac-backend.service`
|
|||
|
|
|
|||
|
|
```ini
|
|||
|
|
[Unit]
|
|||
|
|
Description=甲辰藏品管理系统 FastAPI 后端服务
|
|||
|
|
After=network.target
|
|||
|
|
|
|||
|
|
[Service]
|
|||
|
|
Type=simple
|
|||
|
|
User=admin
|
|||
|
|
WorkingDirectory=/home/admin/.openclaw/workspace/zodiac-collector/backend-fastapi
|
|||
|
|
ExecStart=/usr/local/python3.12/bin/python3.12 -m uvicorn app.main:app --port 3000 --host 0.0.0.0
|
|||
|
|
Restart=always
|
|||
|
|
RestartSec=3
|
|||
|
|
|
|||
|
|
[Install]
|
|||
|
|
WantedBy=multi-user.target
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**启用命令**:
|
|||
|
|
```bash
|
|||
|
|
sudo systemctl daemon-reload
|
|||
|
|
sudo systemctl enable zodiac-backend
|
|||
|
|
sudo systemctl start zodiac-backend
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📋 使用指南
|
|||
|
|
|
|||
|
|
### 启动服务
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 方法 1: 使用启动脚本
|
|||
|
|
/home/admin/.openclaw/workspace/zodiac-collector/backend-fastapi/start.sh
|
|||
|
|
|
|||
|
|
# 方法 2: 手动启动
|
|||
|
|
cd /home/admin/.openclaw/workspace/zodiac-collector/backend-fastapi
|
|||
|
|
nohup /usr/local/python3.12/bin/python3.12 -m uvicorn app.main:app --port 3000 --host 0.0.0.0 > /tmp/zodiac-backend.log 2>&1 &
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 停止服务
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 方法 1: 使用 PID 文件
|
|||
|
|
kill $(cat /tmp/zodiac-backend.pid)
|
|||
|
|
|
|||
|
|
# 方法 2: 杀死进程
|
|||
|
|
pkill -f "uvicorn app.main:app"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 查看状态
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 查看进程
|
|||
|
|
ps aux | grep uvicorn
|
|||
|
|
|
|||
|
|
# 查看日志
|
|||
|
|
tail -f /tmp/zodiac-backend.log
|
|||
|
|
|
|||
|
|
# 查看监控日志
|
|||
|
|
tail -f /tmp/backend-watch.log
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 重启服务
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
pkill -f "uvicorn app.main:app"
|
|||
|
|
sleep 2
|
|||
|
|
/home/admin/.openclaw/workspace/zodiac-collector/backend-fastapi/start.sh
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔧 故障排查
|
|||
|
|
|
|||
|
|
### 问题 1: 服务无法启动
|
|||
|
|
|
|||
|
|
**检查端口占用**:
|
|||
|
|
```bash
|
|||
|
|
netstat -tlnp | grep 3000
|
|||
|
|
# 如果占用,杀死进程
|
|||
|
|
kill -9 $(lsof -t -i:3000)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**检查 Python 路径**:
|
|||
|
|
```bash
|
|||
|
|
which python3.12
|
|||
|
|
# 应该是:/usr/local/python3.12/bin/python3.12
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**检查依赖**:
|
|||
|
|
```bash
|
|||
|
|
cd /home/admin/.openclaw/workspace/zodiac-collector/backend-fastapi
|
|||
|
|
pip3 list | grep -i "fastapi\|uvicorn\|sqlalchemy"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 问题 2: 服务频繁重启
|
|||
|
|
|
|||
|
|
**查看监控日志**:
|
|||
|
|
```bash
|
|||
|
|
tail -100 /tmp/backend-watch.log
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**查看系统日志**:
|
|||
|
|
```bash
|
|||
|
|
dmesg | grep -i "killed\|oom"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**检查资源使用**:
|
|||
|
|
```bash
|
|||
|
|
free -h
|
|||
|
|
df -h
|
|||
|
|
top -bn1 | head -20
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 问题 3: Crontab 不执行
|
|||
|
|
|
|||
|
|
**检查 crontab 配置**:
|
|||
|
|
```bash
|
|||
|
|
crontab -l
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**检查 cron 服务**:
|
|||
|
|
```bash
|
|||
|
|
systemctl status crond
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**查看 cron 日志**:
|
|||
|
|
```bash
|
|||
|
|
tail -f /var/log/cron
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 监控指标
|
|||
|
|
|
|||
|
|
### 进程状态
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 进程是否在运行
|
|||
|
|
ps aux | grep uvicorn | grep -v grep | wc -l
|
|||
|
|
# 应该返回:1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 服务响应
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 测试 API 响应
|
|||
|
|
curl -s http://localhost:3000/api/auth/login -X POST \
|
|||
|
|
-H "Content-Type: application/x-www-form-urlencoded" \
|
|||
|
|
-d "username=admin&password=admin123" | python3 -c "import sys,json; d=json.load(sys.stdin); print('正常' if 'access_token' in d else '异常')"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 日志大小
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 检查日志文件大小
|
|||
|
|
ls -lh /tmp/zodiac-backend.log
|
|||
|
|
# 如果>100MB,考虑轮转
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 最佳实践
|
|||
|
|
|
|||
|
|
### 1. 定期重启
|
|||
|
|
|
|||
|
|
建议每周重启一次服务,释放内存:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 添加到 crontab
|
|||
|
|
0 3 * * 0 pkill -f "uvicorn app.main:app" && sleep 2 && /home/admin/.openclaw/workspace/zodiac-collector/backend-fastapi/start.sh
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 日志轮转
|
|||
|
|
|
|||
|
|
创建 `/etc/logrotate.d/zodiac-backend`:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
/tmp/zodiac-backend.log {
|
|||
|
|
daily
|
|||
|
|
rotate 7
|
|||
|
|
compress
|
|||
|
|
delaycompress
|
|||
|
|
missingok
|
|||
|
|
notifempty
|
|||
|
|
create 0644 admin admin
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. 监控告警
|
|||
|
|
|
|||
|
|
可以添加简单的告警脚本:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
#!/bin/bash
|
|||
|
|
if ! curl -s http://localhost:3000/health > /dev/null; then
|
|||
|
|
echo "后端服务异常!" | mail -s "告警:后端服务宕机" admin@example.com
|
|||
|
|
fi
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📝 配置文件清单
|
|||
|
|
|
|||
|
|
| 文件 | 路径 | 说明 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| **启动脚本** | `backend-fastapi/start.sh` | 服务启动脚本 |
|
|||
|
|
| **PID 文件** | `/tmp/zodiac-backend.pid` | 进程 ID |
|
|||
|
|
| **日志文件** | `/tmp/zodiac-backend.log` | 运行日志 |
|
|||
|
|
| **监控日志** | `/tmp/backend-watch.log` | 监控日志 |
|
|||
|
|
| **Crontab** | `crontab -l` | 定时任务 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ✅ 验证清单
|
|||
|
|
|
|||
|
|
- [x] 启动脚本已创建
|
|||
|
|
- [x] 脚本权限已设置 (chmod +x)
|
|||
|
|
- [x] Crontab 监控已配置
|
|||
|
|
- [x] 服务正在运行
|
|||
|
|
- [x] API 响应正常
|
|||
|
|
- [ ] systemd 服务(备选)
|
|||
|
|
- [ ] 日志轮转配置
|
|||
|
|
- [ ] 监控告警配置
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**配置完成!后端服务现在具有自动恢复能力!** 🎉
|