网关错误怎么区分
网关类的三个错误码最容易混淆,可以用一句话概括:连不上上游是网关错误,上游还在但服务自己暂时不接客是不可用错误,能连上但等不到结果就是超时错误。三者都出现在网关与上游之间,但第一现场不同——网关错误看连接失败日志,不可用看容量与维护状态,超时看上游响应时间。判断错了层级,所有后续动作都会落空。
基本信息
| 共同点 | 错误都出现在网关与上游之间 |
|---|---|
| 区分依据 | 连接是否建立、上游是否响应、响应是否超时 |
| 第一现场 | 网关错误日志中的连接与上游相关行 |
| 排查入口 | 连接失败看日志、容量问题看指标、超时看耗时分布 |
| 处置差异 | 拉起后端、扩容限流、优化慢点 |
三个错误码对照
| 错误码 | 语义 | 第一现场 | 常见动作 |
|---|---|---|---|
| 网关错误 | 连不上上游或收到无效响应 | 网关日志里的连接失败与上游相关行 | 拉起后端,核对端口与协议 |
| 服务不可用 | 暂时不服务,过载或维护 | 限流器、维护开关与连接池指标 | 扩容、限流、放出带重试提示的降级页 |
| 网关超时 | 等待上游处理超过时限 | 上游响应时间与慢查询日志 | 优化慢点,长任务改异步,评估超时阈值 |
用日志快速分类
用日志快速分类
tail -100 /var/log/nginx/error.log | grep -E '502|503|504' # 先看有哪些错误
# 按关键字归类:出现连接类关键字说明上游不可达
# 出现无可用上游说明健康检查全部失败
# 出现超时关键字说明上游处理太慢
tail -100 /var/log/nginx/error.log | grep -oE 'Connection refused|upstream timed out|no live upstreams|invalid response' | sort | uniq -c处置要点
- 上游不可达时先看进程与端口,再看监听地址与协议是否与网关配置一致
- 服务不可用时先确认是主动降级还是被动过载,两者的修复路径相反
- 超时类错误要区分是上游自身慢还是被排队拖慢,对照上游响应时间即可判断
- 三类错误都要有自定义错误页,不要暴露网关默认页
- 错误页要设短缓存,否则后端恢复了用户仍看到旧错误
排查要点
- 先证明上游是否收到请求,再分析上游自己的日志,可以避免大量无效猜测
- 把状态码与上游地址写进访问日志,事后分析不必重现现场
- 同一错误码在不同网关层含义可能不同,以产生错误的那一层日志为准
三者的共同点都是「责任在服务端侧」,因此客户端能做的主要是退避重试;差别在服务端内部的修复动作完全不同,误判层级会让值班同学在错误的方向上耗费最宝贵的故障时间。
把错误页交给边缘节点缓存又不设置短缓存,会让后端恢复之后用户仍持续看到错误提示,必须手动刷新缓存才能恢复,故障时长被无谓拉长。