221 lines
4.9 KiB
Markdown
221 lines
4.9 KiB
Markdown
|
|
# 502 Bad Gateway 错误排查指南
|
|||
|
|
|
|||
|
|
## 错误说明
|
|||
|
|
|
|||
|
|
`502 Bad Gateway` 表示 Nginx 无法连接到后端服务。通常是因为:
|
|||
|
|
1. **后端服务未启动**
|
|||
|
|
2. **Nginx配置中的端口不正确**(最常见)
|
|||
|
|
3. **后端服务启动失败**
|
|||
|
|
4. **防火墙阻止连接**
|
|||
|
|
|
|||
|
|
## 排查步骤
|
|||
|
|
|
|||
|
|
### 1. 检查后端服务是否启动
|
|||
|
|
|
|||
|
|
在服务器上执行:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 检查18082端口是否在监听
|
|||
|
|
netstat -tlnp | grep 18082
|
|||
|
|
# 或
|
|||
|
|
ss -tlnp | grep 18082
|
|||
|
|
|
|||
|
|
# 检查Java进程
|
|||
|
|
ps aux | grep java
|
|||
|
|
# 或
|
|||
|
|
jps -l
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**如果端口没有监听:**
|
|||
|
|
- 后端服务没有启动
|
|||
|
|
- 需要启动后端服务
|
|||
|
|
|
|||
|
|
### 2. 检查Nginx配置(最重要)
|
|||
|
|
|
|||
|
|
在宝塔面板中:
|
|||
|
|
1. 网站 → 设置 → 配置文件
|
|||
|
|
2. 找到 `location /api/` 配置块
|
|||
|
|
3. **确认 `proxy_pass` 端口是 `18082`**
|
|||
|
|
|
|||
|
|
**正确的配置:**
|
|||
|
|
```nginx
|
|||
|
|
location /api/ {
|
|||
|
|
proxy_pass http://127.0.0.1:18082; # ← 必须是18082,不是8082
|
|||
|
|
proxy_set_header Host $host;
|
|||
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|||
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**错误的配置(会导致502):**
|
|||
|
|
```nginx
|
|||
|
|
location /api/ {
|
|||
|
|
proxy_pass http://127.0.0.1:8082; # ← 错误:端口还是8082
|
|||
|
|
...
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**修改后必须:**
|
|||
|
|
1. 点击"保存"
|
|||
|
|
2. 点击"重载配置"或"重启Nginx"
|
|||
|
|
|
|||
|
|
### 3. 测试后端服务是否正常
|
|||
|
|
|
|||
|
|
在服务器上执行:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 测试后端API是否可访问
|
|||
|
|
curl http://127.0.0.1:18082/api/health
|
|||
|
|
# 或
|
|||
|
|
curl http://127.0.0.1:18082/api/erp/user/login -X POST -H "Content-Type: application/json" -d '{"username":"test","password":"test"}'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**如果返回连接拒绝:**
|
|||
|
|
- 后端服务没有启动
|
|||
|
|
- 检查启动日志
|
|||
|
|
|
|||
|
|
**如果返回正常响应:**
|
|||
|
|
- 后端服务正常
|
|||
|
|
- 问题在Nginx配置
|
|||
|
|
|
|||
|
|
### 4. 检查后端启动日志
|
|||
|
|
|
|||
|
|
查看后端启动日志,确认:
|
|||
|
|
- 服务是否成功启动
|
|||
|
|
- 是否监听在 `18082` 端口
|
|||
|
|
- 是否有错误信息
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 如果使用nohup启动
|
|||
|
|
tail -f app.log
|
|||
|
|
|
|||
|
|
# 或查看Spring Boot启动日志
|
|||
|
|
# 应该看到类似信息:
|
|||
|
|
# Tomcat started on port(s): 18082 (http)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 5. 检查防火墙
|
|||
|
|
|
|||
|
|
在宝塔面板中:
|
|||
|
|
1. 安全 → 防火墙
|
|||
|
|
2. 确认端口 `18082` 已开放(如果后端需要外部访问)
|
|||
|
|
3. **注意:** 如果后端只监听 `127.0.0.1`,不需要开放防火墙
|
|||
|
|
|
|||
|
|
### 6. 检查后端监听地址
|
|||
|
|
|
|||
|
|
确认后端配置:
|
|||
|
|
|
|||
|
|
**application-dev.yml:**
|
|||
|
|
```yaml
|
|||
|
|
server:
|
|||
|
|
port: 18082
|
|||
|
|
# 如果没有配置 address,默认监听 0.0.0.0(所有网卡)
|
|||
|
|
# 如果配置了 address: 127.0.0.1,只监听本地
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**如果后端只监听 127.0.0.1:**
|
|||
|
|
- Nginx的 `proxy_pass` 必须使用 `http://127.0.0.1:18082`
|
|||
|
|
- 不能使用 `http://175.178.252.59:18082`
|
|||
|
|
|
|||
|
|
## 快速修复步骤
|
|||
|
|
|
|||
|
|
### 步骤1:确认后端服务已启动
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 在服务器上执行
|
|||
|
|
java -jar mt-startup-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
|
|||
|
|
|
|||
|
|
# 或后台运行
|
|||
|
|
nohup java -jar mt-startup-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev > app.log 2>&1 &
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 步骤2:修改Nginx配置
|
|||
|
|
|
|||
|
|
在宝塔面板中修改配置文件:
|
|||
|
|
|
|||
|
|
```nginx
|
|||
|
|
location /api/ {
|
|||
|
|
proxy_pass http://127.0.0.1:18082; # 确保是18082
|
|||
|
|
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_connect_timeout 60s;
|
|||
|
|
proxy_send_timeout 60s;
|
|||
|
|
proxy_read_timeout 60s;
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 步骤3:重载Nginx
|
|||
|
|
|
|||
|
|
在宝塔面板中:
|
|||
|
|
1. 保存配置
|
|||
|
|
2. 重载配置
|
|||
|
|
|
|||
|
|
### 步骤4:验证
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 在服务器上测试
|
|||
|
|
curl http://127.0.0.1/api/erp/user/login -X POST -H "Content-Type: application/json" -d '{"username":"test","password":"test"}'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 常见问题
|
|||
|
|
|
|||
|
|
### Q1: 修改了Nginx配置,但还是502?
|
|||
|
|
|
|||
|
|
**A:** 检查是否:
|
|||
|
|
- 保存了配置
|
|||
|
|
- 重载了Nginx(不是只保存)
|
|||
|
|
- 确认端口是 `18082`,不是 `8082`
|
|||
|
|
|
|||
|
|
### Q2: 后端服务启动了,但Nginx还是502?
|
|||
|
|
|
|||
|
|
**A:** 检查:
|
|||
|
|
- Nginx配置中的端口是否正确
|
|||
|
|
- 后端是否真的在 `18082` 端口监听
|
|||
|
|
- Nginx错误日志:`/www/wwwlogs/175.178.252.59.error.log`
|
|||
|
|
|
|||
|
|
### Q3: 如何查看Nginx错误日志?
|
|||
|
|
|
|||
|
|
**A:** 在宝塔面板中:
|
|||
|
|
- 网站 → 日志 → 错误日志
|
|||
|
|
- 或直接查看:`/www/wwwlogs/175.178.252.59.error.log`
|
|||
|
|
|
|||
|
|
查看是否有类似错误:
|
|||
|
|
```
|
|||
|
|
connect() failed (111: Connection refused) while connecting to upstream
|
|||
|
|
```
|
|||
|
|
这表示无法连接到后端。
|
|||
|
|
|
|||
|
|
## 验证清单
|
|||
|
|
|
|||
|
|
- [ ] 后端服务已启动
|
|||
|
|
- [ ] 后端监听在 `18082` 端口
|
|||
|
|
- [ ] Nginx配置中 `proxy_pass` 端口是 `18082`
|
|||
|
|
- [ ] Nginx配置已保存并重载
|
|||
|
|
- [ ] 防火墙已开放(如果需要)
|
|||
|
|
- [ ] 后端启动日志无错误
|
|||
|
|
|
|||
|
|
## 如果还是无法解决
|
|||
|
|
|
|||
|
|
1. **查看Nginx错误日志**
|
|||
|
|
```bash
|
|||
|
|
tail -f /www/wwwlogs/175.178.252.59.error.log
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **查看后端启动日志**
|
|||
|
|
```bash
|
|||
|
|
tail -f app.log
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **检查端口占用**
|
|||
|
|
```bash
|
|||
|
|
netstat -tlnp | grep 18082
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
4. **测试后端直接访问**
|
|||
|
|
```bash
|
|||
|
|
curl http://127.0.0.1:18082/api/health
|
|||
|
|
```
|
|||
|
|
|