399 lines
9.2 KiB
Markdown
399 lines
9.2 KiB
Markdown
|
|
# 部署问题排查指南
|
|||
|
|
|
|||
|
|
## 问题描述
|
|||
|
|
|
|||
|
|
访问项目时出现 404 或 500 错误,Nginx 配置未正确生成或生效。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 排查步骤
|
|||
|
|
|
|||
|
|
### 1. 检查容器是否正常运行
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 查看容器状态
|
|||
|
|
docker ps | grep auto-deploy-demo
|
|||
|
|
|
|||
|
|
# 查看容器日志
|
|||
|
|
docker logs auto-deploy-demo
|
|||
|
|
|
|||
|
|
# 查看最近日志
|
|||
|
|
docker logs --tail 50 auto-deploy-demo
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**预期输出**:
|
|||
|
|
- 容器状态为 `Up`
|
|||
|
|
- 日志显示 `Server running on port 8888`
|
|||
|
|
- 日志显示 `Running mode: Nginx dynamic routing`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 2. 检查项目状态
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 查看项目数据
|
|||
|
|
docker exec auto-deploy-demo cat /app/data/projects.json
|
|||
|
|
|
|||
|
|
# 查看项目目录
|
|||
|
|
docker exec auto-deploy-demo ls -la /app/projects/
|
|||
|
|
|
|||
|
|
# 查看具体项目文件
|
|||
|
|
docker exec auto-deploy-demo ls -la /app/projects/{项目ID}/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**检查要点**:
|
|||
|
|
- 项目状态是否为 `running`
|
|||
|
|
- 项目是否有 `port` 字段
|
|||
|
|
- 项目目录是否存在且包含文件
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 3. 检查项目服务是否运行
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 查看所有进程
|
|||
|
|
docker exec auto-deploy-demo ps aux
|
|||
|
|
|
|||
|
|
# 查看 Node.js 进程
|
|||
|
|
docker exec auto-deploy-demo ps aux | grep node
|
|||
|
|
|
|||
|
|
# 测试项目端口(假设项目端口是 9000)
|
|||
|
|
docker exec auto-deploy-demo wget -qO- http://127.0.0.1:9000/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**预期输出**:
|
|||
|
|
- 应该有多个 node 进程(主服务 + 项目服务)
|
|||
|
|
- 项目端口能返回 HTML 内容
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 4. 检查 Nginx 配置
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 查看 Nginx 配置文件
|
|||
|
|
docker exec auto-deploy-demo cat /app/nginx/sites-enabled/auto-deploy.conf
|
|||
|
|
|
|||
|
|
# 检查 Nginx 配置语法
|
|||
|
|
docker exec auto-deploy-demo nginx -t
|
|||
|
|
|
|||
|
|
# 查看 Nginx 错误日志
|
|||
|
|
docker exec auto-deploy-demo cat /var/log/nginx/error.log
|
|||
|
|
|
|||
|
|
# 查看 Nginx 访问日志
|
|||
|
|
docker exec auto-deploy-demo tail -20 /var/log/nginx/access.log
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**检查要点**:
|
|||
|
|
- 配置文件中是否包含项目路由
|
|||
|
|
- 配置语法是否正确
|
|||
|
|
- 错误日志是否有循环重定向等问题
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 5. 测试内部访问
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 测试主页面
|
|||
|
|
docker exec auto-deploy-demo wget -qO- http://127.0.0.1:80/ | head -20
|
|||
|
|
|
|||
|
|
# 测试 API
|
|||
|
|
docker exec auto-deploy-demo wget -qO- http://127.0.0.1:8888/api/projects
|
|||
|
|
|
|||
|
|
# 测试项目访问(假设项目ID是 1772016995850,端口是 9000)
|
|||
|
|
docker exec auto-deploy-demo wget -qO- http://127.0.0.1:80/project/1772016995850/
|
|||
|
|
|
|||
|
|
# 直接测试项目服务
|
|||
|
|
docker exec auto-deploy-demo wget -qO- http://127.0.0.1:9000/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 6. 常见问题及修复
|
|||
|
|
|
|||
|
|
#### 问题 1:Nginx 配置中没有项目路由
|
|||
|
|
|
|||
|
|
**症状**:配置文件中 `# 项目路由 - 由系统动态生成` 下面为空
|
|||
|
|
|
|||
|
|
**原因**:
|
|||
|
|
- 项目启动时未正确更新 Nginx 配置
|
|||
|
|
- 项目对象没有传递 port 字段
|
|||
|
|
|
|||
|
|
**修复**:
|
|||
|
|
```bash
|
|||
|
|
# 进入容器
|
|||
|
|
docker exec -it auto-deploy-demo sh
|
|||
|
|
|
|||
|
|
# 手动重新生成配置
|
|||
|
|
cd /app
|
|||
|
|
node -e "
|
|||
|
|
const nginxManager = require('./server/services/nginxManager');
|
|||
|
|
const projectService = require('./server/services/projectService');
|
|||
|
|
const fs = require('fs');
|
|||
|
|
|
|||
|
|
const projects = projectService.getAllProjects();
|
|||
|
|
const running = projects.filter(p => p.status === 'running');
|
|||
|
|
|
|||
|
|
running.forEach(p => {
|
|||
|
|
const projectWithPort = { ...p, port: p.port };
|
|||
|
|
nginxManager.addProjectLocation(projectWithPort);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
console.log(nginxManager.safeReload());
|
|||
|
|
"
|
|||
|
|
|
|||
|
|
exit
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
#### 问题 2:循环重定向 (500 错误)
|
|||
|
|
|
|||
|
|
**症状**:错误日志显示 `rewrite or internal redirection cycle`
|
|||
|
|
|
|||
|
|
**原因**:Nginx 配置中的 `try_files` 导致循环
|
|||
|
|
|
|||
|
|
**修复**:
|
|||
|
|
```bash
|
|||
|
|
# 进入容器
|
|||
|
|
docker exec -it auto-deploy-demo sh
|
|||
|
|
|
|||
|
|
# 删除 try_files 行
|
|||
|
|
sed -i '/try_files/d' /app/nginx/sites-enabled/auto-deploy.conf
|
|||
|
|
|
|||
|
|
# 重载 Nginx
|
|||
|
|
nginx -s reload
|
|||
|
|
|
|||
|
|
exit
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
#### 问题 3:项目服务未启动
|
|||
|
|
|
|||
|
|
**症状**:项目端口连接被拒绝 `Connection refused`
|
|||
|
|
|
|||
|
|
**原因**:
|
|||
|
|
- 容器重启后项目进程丢失
|
|||
|
|
- 项目启动失败
|
|||
|
|
|
|||
|
|
**修复**:
|
|||
|
|
```bash
|
|||
|
|
# 在管理界面手动停止再启动项目
|
|||
|
|
# 或者重启容器
|
|||
|
|
docker restart auto-deploy-demo
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
#### 问题 4:404 Not Found
|
|||
|
|
|
|||
|
|
**症状**:访问项目返回 404,Nginx 版本号显示在页面底部
|
|||
|
|
|
|||
|
|
**原因**:
|
|||
|
|
- Nginx 配置中没有对应项目的路由
|
|||
|
|
- 项目 ID 不匹配
|
|||
|
|
|
|||
|
|
**修复**:
|
|||
|
|
1. 确认项目状态为 `running`
|
|||
|
|
2. 确认 Nginx 配置中包含该项目路由
|
|||
|
|
3. 手动重新生成配置(见问题 1 的修复方法)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
#### 问题 5:静态资源加载失败 (MIME type 错误)
|
|||
|
|
|
|||
|
|
**症状**:控制台报错 `Expected a JavaScript-or-Wasm module script but the server responded with a MIME type of "text/html"`
|
|||
|
|
|
|||
|
|
**原因**:前端项目的静态资源路径是绝对路径 `/assets/...`,被 Nginx 的 `/` location 捕获,代理到了管理后台
|
|||
|
|
|
|||
|
|
**修复**:
|
|||
|
|
```bash
|
|||
|
|
# 进入容器
|
|||
|
|
docker exec -it auto-deploy-demo sh
|
|||
|
|
|
|||
|
|
# 修改项目 HTML 文件,将绝对路径改为相对路径
|
|||
|
|
sed -i 's|src="/|src="./|g' /app/projects/{项目ID}/index.html
|
|||
|
|
sed -i 's|href="/|href="./|g' /app/projects/{项目ID}/index.html
|
|||
|
|
|
|||
|
|
# 查看修改结果
|
|||
|
|
cat /app/projects/{项目ID}/index.html
|
|||
|
|
|
|||
|
|
exit
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**注意**:新版本已自动修复此问题,上传新项目时会自动转换路径
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 手动配置 Nginx
|
|||
|
|
|
|||
|
|
### 手动添加项目路由
|
|||
|
|
|
|||
|
|
如果自动生成失败,可以手动添加项目路由配置:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 进入容器编辑配置
|
|||
|
|
docker exec -it auto-deploy-demo vi /app/nginx/sites-enabled/auto-deploy.conf
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
在 `# 项目路由 - 由系统动态生成` 下面添加:
|
|||
|
|
|
|||
|
|
```nginx
|
|||
|
|
# Project: 项目名称 (项目ID)
|
|||
|
|
location /project/项目ID/ {
|
|||
|
|
proxy_pass http://127.0.0.1:项目端口/;
|
|||
|
|
proxy_set_header Host $host;
|
|||
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|||
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|||
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|||
|
|
|
|||
|
|
# WebSocket支持
|
|||
|
|
proxy_http_version 1.1;
|
|||
|
|
proxy_set_header Upgrade $http_upgrade;
|
|||
|
|
proxy_set_header Connection "upgrade";
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**示例**(项目ID: 1772019512922,端口: 9000):
|
|||
|
|
|
|||
|
|
```nginx
|
|||
|
|
# Project: lot (1772019512922)
|
|||
|
|
location /project/1772019512922/ {
|
|||
|
|
proxy_pass http://127.0.0.1:9000/;
|
|||
|
|
proxy_set_header Host $host;
|
|||
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|||
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|||
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|||
|
|
|
|||
|
|
# WebSocket支持
|
|||
|
|
proxy_http_version 1.1;
|
|||
|
|
proxy_set_header Upgrade $http_upgrade;
|
|||
|
|
proxy_set_header Connection "upgrade";
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 在容器外操作 Nginx
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 测试 Nginx 配置语法
|
|||
|
|
docker exec auto-deploy-demo nginx -t
|
|||
|
|
|
|||
|
|
# 重新加载 Nginx 配置(在容器外执行)
|
|||
|
|
docker exec auto-deploy-demo nginx -s reload
|
|||
|
|
|
|||
|
|
# 查看 Nginx 配置
|
|||
|
|
docker exec auto-deploy-demo cat /app/nginx/sites-enabled/auto-deploy.conf
|
|||
|
|
|
|||
|
|
# 查看 Nginx 错误日志
|
|||
|
|
docker exec auto-deploy-demo cat /var/log/nginx/error.log
|
|||
|
|
|
|||
|
|
# 查看 Nginx 访问日志
|
|||
|
|
docker exec auto-deploy-demo tail -50 /var/log/nginx/access.log
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 7. 一键诊断脚本
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
docker exec auto-deploy-demo sh -c '
|
|||
|
|
echo "=== 容器进程 ==="
|
|||
|
|
ps aux | grep -E "node|nginx"
|
|||
|
|
echo ""
|
|||
|
|
echo "=== 项目数据 ==="
|
|||
|
|
cat /app/data/projects.json 2>/dev/null | head -50
|
|||
|
|
echo ""
|
|||
|
|
echo "=== Nginx 配置 ==="
|
|||
|
|
cat /app/nginx/sites-enabled/auto-deploy.conf 2>/dev/null
|
|||
|
|
echo ""
|
|||
|
|
echo "=== Nginx 错误日志 ==="
|
|||
|
|
tail -20 /var/log/nginx/error.log 2>/dev/null
|
|||
|
|
echo ""
|
|||
|
|
echo "=== 测试主页面 ==="
|
|||
|
|
wget -qO- http://127.0.0.1:80/ 2>/dev/null | head -5
|
|||
|
|
echo ""
|
|||
|
|
echo "=== 测试 API ==="
|
|||
|
|
wget -qO- http://127.0.0.1:8888/api/projects 2>/dev/null | head -50
|
|||
|
|
'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 8. 重新部署步骤
|
|||
|
|
|
|||
|
|
如果以上方法都无法解决问题,请重新部署:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 1. 停止并删除旧容器
|
|||
|
|
docker rm -f auto-deploy-demo
|
|||
|
|
|
|||
|
|
# 2. 清理数据(谨慎操作!)
|
|||
|
|
# rm -rf /opt/auto-deploy/data/*
|
|||
|
|
# rm -rf /opt/auto-deploy/projects/*
|
|||
|
|
|
|||
|
|
# 3. 上传新的部署包并解压
|
|||
|
|
cd /opt/auto-deploy
|
|||
|
|
unzip -o auto-deploy-dist.zip
|
|||
|
|
|
|||
|
|
# 4. 创建 Nginx 配置目录
|
|||
|
|
mkdir -p nginx/sites-enabled
|
|||
|
|
|
|||
|
|
# 5. 构建镜像
|
|||
|
|
docker build -t auto-deploy-demo:latest .
|
|||
|
|
|
|||
|
|
# 6. 启动容器(带 Nginx 配置映射)
|
|||
|
|
docker run -d \
|
|||
|
|
--name auto-deploy-demo \
|
|||
|
|
--restart unless-stopped \
|
|||
|
|
-p 8181:80 \
|
|||
|
|
-v $(pwd)/data:/app/data \
|
|||
|
|
-v $(pwd)/projects:/app/projects \
|
|||
|
|
-v $(pwd)/nginx/sites-enabled:/app/nginx/sites-enabled \
|
|||
|
|
-e PORT=8888 \
|
|||
|
|
-e BASE_DOMAIN=ashai.com.cn:8181 \
|
|||
|
|
-e USE_NGINX=true \
|
|||
|
|
-e PROJECT_BIND_ADDRESS=127.0.0.1 \
|
|||
|
|
auto-deploy-demo:latest
|
|||
|
|
|
|||
|
|
# 7. 查看日志
|
|||
|
|
docker logs -f auto-deploy-demo
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 架构说明
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
用户请求
|
|||
|
|
↓
|
|||
|
|
宿主机:8181
|
|||
|
|
↓
|
|||
|
|
容器 Nginx:80
|
|||
|
|
↓
|
|||
|
|
├─ /api/* → Node.js:8888
|
|||
|
|
├─ /project/{id}/* → 项目服务:900x
|
|||
|
|
└─ / → 管理后台静态文件
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 相关文件位置
|
|||
|
|
|
|||
|
|
| 文件 | 容器内路径 | 宿主机路径(如果映射) |
|
|||
|
|
|------|-----------|----------------------|
|
|||
|
|
| Nginx 配置 | `/app/nginx/sites-enabled/auto-deploy.conf` | `./nginx/sites-enabled/auto-deploy.conf` |
|
|||
|
|
| 项目数据 | `/app/data/projects.json` | `./data/projects.json` |
|
|||
|
|
| 项目文件 | `/app/projects/{项目ID}/` | `./projects/{项目ID}/` |
|
|||
|
|
| Nginx 错误日志 | `/var/log/nginx/error.log` | - |
|
|||
|
|
| Nginx 访问日志 | `/var/log/nginx/access.log` | - |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 联系方式
|
|||
|
|
|
|||
|
|
如有问题,请提供以下信息:
|
|||
|
|
1. `docker logs auto-deploy-demo` 的输出
|
|||
|
|
2. `docker exec auto-deploy-demo cat /app/nginx/sites-enabled/auto-deploy.conf`
|
|||
|
|
3. `docker exec auto-deploy-demo cat /app/data/projects.json`
|
|||
|
|
4. `docker exec auto-deploy-demo cat /var/log/nginx/error.log`
|