121 lines
2.7 KiB
Markdown
121 lines
2.7 KiB
Markdown
|
|
# 502 Bad Gateway - 后端启动失败
|
|||
|
|
|
|||
|
|
> 日期:2026-07-05
|
|||
|
|
> 问题:坐席端登录失败,返回 502 Bad Gateway
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 一、问题现象
|
|||
|
|
|
|||
|
|
用户访问 `https://itsupport.servyou.com.cn/itagent/` 时提示登录失败:
|
|||
|
|
```
|
|||
|
|
Failed to load resource: the server responded with a status of 502 (Bad Gateway)
|
|||
|
|
AxiosError: Request failed with status code 502
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 二、诊断过程
|
|||
|
|
|
|||
|
|
### 2.1 检查容器状态
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
docker ps -a
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
发现后端容器状态为 `unhealthy`:
|
|||
|
|
```
|
|||
|
|
CONTAINER ID IMAGE STATUS
|
|||
|
|
656f7696d4e5 wecom-it-desk-backend:latest Up 8 minutes (unhealthy)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2.2 检查后端日志
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
docker logs 656f7696d4e5 --tail 30
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
发现错误:
|
|||
|
|
```
|
|||
|
|
ModuleNotFoundError: No module named 'aioredis'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2.3 原因分析
|
|||
|
|
|
|||
|
|
- 旧版镜像中代码使用 `import aioredis`
|
|||
|
|
- 但 `aioredis` 包与 Python 3.12 不兼容
|
|||
|
|
- 报错:`TypeError: duplicate base class TimeoutError`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 三、解决方案
|
|||
|
|
|
|||
|
|
### 3.1 尝试修复(失败)
|
|||
|
|
|
|||
|
|
尝试在容器内安装 `aioredis` 包,但发现:
|
|||
|
|
- `aioredis` 与 Python 3.12 不兼容
|
|||
|
|
- 安装后仍报错:`TypeError: duplicate base class TimeoutError`
|
|||
|
|
|
|||
|
|
### 3.2 最终方案
|
|||
|
|
|
|||
|
|
删除旧容器,使用正确的环境变量重新启动:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 1. 删除旧容器
|
|||
|
|
docker stop 656f7696d4e5
|
|||
|
|
docker rm 656f7696d4e5
|
|||
|
|
|
|||
|
|
# 2. 使用正确的 PYTHONPATH 重新启动
|
|||
|
|
cd /opt/wecom-it-desk
|
|||
|
|
PYTHONPATH=/app docker compose up -d backend
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
关键点:**必须设置 `PYTHONPATH=/app`**,否则会报错 `ModuleNotFoundError: No module named 'app.core'`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 四、验证结果
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 检查容器状态
|
|||
|
|
docker ps
|
|||
|
|
# 输出:
|
|||
|
|
# 2ec80dee024c wecom-it-desk-backend:latest Up 5 minutes (healthy)
|
|||
|
|
# e147524342fa redis:7-alpine Up 11 hours (healthy)
|
|||
|
|
# 8a2265864f34 nginx:1.27-alpine Up 11 hours
|
|||
|
|
# 433ef922c8d8 postgres:16-alpine Up 11 hours (healthy)
|
|||
|
|
|
|||
|
|
# 测试 API
|
|||
|
|
curl http://localhost:8000/health
|
|||
|
|
# 输出:{"status":"ok"}
|
|||
|
|
|
|||
|
|
# 测试页面
|
|||
|
|
curl -sk https://localhost/itdesk/
|
|||
|
|
# 输出:HTML 页面正常返回
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 五、根因总结
|
|||
|
|
|
|||
|
|
| 问题 | 原因 |
|
|||
|
|
|------|------|
|
|||
|
|
| 后端容器 unhealthy | 旧镜像使用 `import aioredis`,与 Python 3.12 不兼容 |
|
|||
|
|
| 启动失败 | 需要设置 `PYTHONPATH=/app` 环境变量 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 六、预防措施
|
|||
|
|
|
|||
|
|
1. **更新镜像**:在 Dockerfile 中将所有 `import aioredis` 改为 `import redis.asyncio as aioredis`
|
|||
|
|
2. **环境变量**:确保 docker-compose.yml 中设置 `PYTHONPATH=/app`
|
|||
|
|
3. **健康检查**:定期检查容器健康状态
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 七、相关文件
|
|||
|
|
|
|||
|
|
- 部署配置:`/opt/wecom-it-desk/docker-compose.yml`
|
|||
|
|
- Nginx 配置:`/opt/wecom-it-desk/nginx/nginx.conf`
|
|||
|
|
- 后端代码:`/opt/wecom-it-desk/backend/`
|