4.3 KiB
4.3 KiB
🔧 502 Bad Gateway 错误解决方案
❓ 问题描述
访问 https://dmp.ink1ing.tech 时出现:
Bad gateway Error code 502
<EFBFBD><EFBFBD> 根本原因
Node.js 服务器进程崩溃或停止了
Cloudflare Tunnel 正常运行,但本地服务器(localhost:3456)无法访问,导致 Tunnel 无法转发请求。
✅ 已解决
服务已重新启动并恢复正常:
- ✅ Node.js 服务器: 运行中 (PID: 93335)
- ✅ Cloudflare Tunnel: 已连接
- ✅ 公网访问: https://dmp.ink1ing.tech 正常
🔍 为什么会挂?
可能的原因
-
内存不足
- Node.js 进程占用内存过多被系统杀掉
-
代码错误
- 重新生成数据库时,旧进程可能因为数据库被删除而崩溃
-
手动停止
- 可能在某个操作中意外停止了进程
-
系统睡眠
- macOS 进入睡眠后某些进程可能被挂起
🛠️ 快速修复方法
方法 1:一键重启(推荐)
cd /Users/inkling/Desktop/dmp
./start-daemon.sh
方法 2:完全重启
cd /Users/inkling/Desktop/dmp
./stop-services.sh
./start-daemon.sh
方法 3:健康检查
cd /Users/inkling/Desktop/dmp
./health-check.sh
如果发现服务未运行,执行方法1重启。
🚨 预防措施
1. 进程监控脚本(已创建)
我创建了 watchdog.sh 脚本,可以:
- 自动检测服务是否崩溃
- 自动重启失败的服务
- 记录监控日志
使用方法:
# 手动运行一次检查
./watchdog.sh
# 或设置 cron 定时任务(每5分钟检查一次)
# 打开 crontab 编辑器
crontab -e
# 添加以下行
*/5 * * * * /Users/inkling/Desktop/dmp/watchdog.sh
2. 开机自启动
创建 macOS LaunchAgent:
cat > ~/Library/LaunchAgents/com.dmp.service.plist << 'PLIST'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.dmp.service</string>
<key>ProgramArguments</key>
<array>
<string>/Users/inkling/Desktop/dmp/start-daemon.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<dict>
<key>SuccessfulExit</key>
<false/>
</dict>
<key>StandardOutPath</key>
<string>/Users/inkling/Desktop/dmp/logs/launchd.log</string>
<key>StandardErrorPath</key>
<string>/Users/inkling/Desktop/dmp/logs/launchd.error.log</string>
</dict>
</plist>
PLIST
# 加载服务
launchctl load ~/Library/LaunchAgents/com.dmp.service.plist
3. 服务器优化
如果频繁崩溃,可以优化 server.js:
// 添加错误处理
process.on('uncaughtException', (err) => {
console.error('未捕获的异常:', err);
// 不退出进程
});
process.on('unhandledRejection', (reason, promise) => {
console.error('未处理的 Promise 拒绝:', reason);
});
📊 监控和日志
查看日志
# 服务器日志
tail -f logs/server.log
# Tunnel 日志
tail -f logs/tunnel.log
# 监控日志
tail -f logs/watchdog.log
# 监控日志(如果设置了)
tail -f logs/monitor.log
检查进程
# 查看所有相关进程
ps aux | grep -E "node server|cloudflared tunnel" | grep -v grep
# 查看进程资源使用
top -pid $(pgrep -f "node server.js")
🔔 告警通知(高级)
可以配置 watchdog 脚本在服务崩溃时发送通知:
# 在 watchdog.sh 中添加
if ! pgrep -f "node server.js" > /dev/null; then
# macOS 通知
osascript -e 'display notification "DMP 服务已崩溃并重启" with title "服务监控"'
# 或发送邮件/企业微信/钉钉等
fi
✅ 验证修复
访问以下地址确认服务正常:
运行健康检查:
./health-check.sh
应该看到所有检查项都是 ✅
📝 故障排查清单
如果仍然出现 502:
- ✅ 检查本地服务:
curl http://localhost:3456 - ✅ 检查进程:
ps aux | grep "node server" - ✅ 检查 Tunnel:
cloudflared tunnel info dmp-tunnel - ✅ 查看日志:
tail -f logs/*.log - ✅ 重启服务:
./start-daemon.sh - ✅ 清除缓存:浏览器 Ctrl+Shift+R 强制刷新
生成时间: $(date)