401是 unauthorized,就是没登录,或者没带token。
场景一:之前遇到的应该是这样。比如前端什么要调用后端什么,发请求的时候没有带uac-token,或者带的token是错的,一般会报401. 在浏览器F12看那个报错,基本上可以大概率定位到是token 的问题,这个开发就可以解决了。
场景二:docker客户端往harbor push镜像的时候,会报这个401,一般就是没有docker login
403是forbidden,就是不让。就是知道你登录了,但是你这个账号没有权限。所以一般应该是要去看看权限配置的问题。
502 bad gateway,一般是网关NG这里的proxy pass的后端服务没启动,或者这个pass的endpoints不对。
503 service unavailable,服务不可用,但可以重试。一般是pod重启的时候,中间这一两分钟会这样。
详细补充说明
401 Unauthorized(未授权)
完整定义
401状态码表示请求缺少有效的身份认证凭据,或者提供的凭据无效。服务器无法识别请求者的身份。
常见原因
- 未登录:用户没有进行身份认证
- 未携带token :请求头中缺少认证令牌(如
Authorization: Bearer <token>) - Token错误 :
- Token格式不正确
- Token签名无效
- Token已过期
- Token被撤销或列入黑名单
- 认证信息错误:用户名/密码错误、API密钥错误等
实际场景补充
- 前端调用后端 :
- 未携带
uac-token或其他认证头 - Token过期需要刷新
- Token格式错误(如缺少Bearer前缀)
- 未携带
- Docker操作 :
docker push到Harbor时未执行docker login- 登录凭据过期
- 没有访问仓库的权限
- API调用 :
- RESTful API调用时缺少认证头
- OAuth token过期
- JWT token无效
排查方法
- 检查浏览器F12 Network标签,查看请求头是否包含认证信息
- 检查token是否过期(查看token的exp字段)
- 验证token格式是否正确
- 确认是否执行了登录操作
403 Forbidden(禁止访问)
完整定义
403状态码表示服务器理解请求,但拒绝执行。与401不同,403表示身份认证已成功,但授权失败(没有权限访问该资源)。
常见原因
- 权限不足:用户已登录,但账号没有访问该资源的权限
- 角色限制:用户角色不允许执行该操作
- 资源限制:访问的资源被限制(如IP白名单、时间限制等)
- 文件系统权限:服务器文件系统权限不允许访问
与401的区别
- 401:身份认证失败(不知道你是谁)
- 403:身份认证成功,但授权失败(知道你是谁,但不允许你访问)
排查方法
- 检查用户角色和权限配置
- 查看RBAC(基于角色的访问控制)配置
- 检查资源访问策略
- 确认IP白名单、时间限制等规则
实际场景
- 普通用户尝试访问管理员功能
- 用户尝试访问其他用户的数据
- API调用时token有效但权限不足
- 文件系统权限不允许Web服务器访问
502 Bad Gateway(网关错误)
完整定义
502状态码表示作为网关或代理的服务器,从上游服务器收到无效响应。网关无法从上游服务器获得有效响应来完成请求。
常见原因
- 后端服务未启动:上游服务器(后端服务)没有运行
- Endpoints配置错误:网关配置的上游服务器地址不正确
- 后端服务崩溃:上游服务器进程崩溃或异常退出
- 网络问题:网关无法连接到上游服务器(网络故障、防火墙阻止)
- 超时:上游服务器响应超时
- 负载过高:上游服务器负载过高,无法及时响应
- 端口错误:配置的端口号不正确
网关场景(Nginx为例)
nginx
# 如果proxy_pass指向的后端服务未启动,会返回502
location /api {
proxy_pass http://backend-service:8080;
# 如果backend-service:8080未启动,返回502
}
排查方法
- 检查后端服务是否运行(
kubectl get pods、docker ps等) - 检查网关配置的upstream/endpoints是否正确
- 检查网络连通性(ping、telnet测试端口)
- 查看后端服务日志,确认是否有错误
- 检查后端服务的健康检查端点
- 验证端口配置是否正确
实际场景
- Kubernetes中Service的Endpoints为空(Pod未运行)
- Nginx proxy_pass指向的服务未启动
- 后端服务进程崩溃
- 后端服务响应超时
- 负载均衡器无法连接到后端服务器
503 Service Unavailable(服务不可用)
完整定义
503状态码表示服务器暂时无法处理请求,通常是由于临时过载或维护。这是一个临时状态,客户端可以稍后重试。
常见原因
- Pod重启:Kubernetes Pod正在重启,服务暂时不可用(通常1-2分钟)
- 服务维护:服务器正在进行维护或更新
- 负载过高:服务器负载过高,无法处理新请求
- 资源不足:CPU、内存等资源不足
- 依赖服务不可用:依赖的下游服务不可用
- 健康检查失败:服务健康检查失败,被标记为不可用
- 限流:服务达到限流阈值,暂时拒绝请求
与502的区别
- 502:网关无法从上游获得有效响应(通常是配置或连接问题)
- 503:服务本身不可用(通常是临时性问题,可以重试)
可重试性
503是临时状态,客户端应该:
- 实现重试机制(指数退避)
- 等待一段时间后重试
- 不要立即重试,避免加重服务器负担
排查方法
- 检查Pod状态(
kubectl get pods,查看是否在重启) - 查看服务日志,确认是否有错误
- 检查资源使用情况(CPU、内存)
- 查看健康检查状态
- 检查依赖服务是否正常
- 查看是否有维护计划
实际场景
- Pod重启:Deployment更新、Pod崩溃重启时,中间1-2分钟返回503
- 滚动更新:Kubernetes滚动更新时,部分Pod不可用
- 高负载:流量突增,服务器暂时无法处理
- 维护模式:应用进入维护模式,返回503
- 限流触发:达到限流阈值,暂时拒绝请求
最佳实践
- 实现优雅关闭(Graceful Shutdown),减少503时间
- 配置健康检查,确保服务就绪后再接收流量
- 实现重试机制和熔断器
- 监控服务可用性,及时发现问题
状态码快速参考
| 状态码 | 含义 | 是否可重试 | 常见原因 |
|---|---|---|---|
| 401 | 未授权 | 否(需重新认证) | 未登录、token无效/过期 |
| 403 | 禁止访问 | 否(需权限) | 已登录但无权限 |
| 502 | 网关错误 | 是 | 后端服务未启动、配置错误 |
| 503 | 服务不可用 | 是(临时) | Pod重启、负载过高、维护中 |
排查流程建议
遇到401时
- 检查请求头是否包含认证信息
- 验证token是否有效(未过期、格式正确)
- 确认是否执行了登录操作
- 检查token刷新机制
遇到403时
- 确认用户已成功登录(不是401)
- 检查用户角色和权限配置
- 查看RBAC策略
- 验证资源访问规则
遇到502时
- 检查后端服务是否运行
- 验证网关配置的endpoints
- 测试网络连通性
- 查看后端服务日志
- 检查健康检查状态
遇到503时
- 检查Pod/服务状态
- 查看服务日志和资源使用
- 确认是否有维护计划
- 检查依赖服务状态
- 实现重试机制(客户端)
总结
这些状态码是HTTP协议中用于表示请求处理结果的重要标识。理解它们的含义和常见原因,可以帮助快速定位和解决问题:
- 401/403:认证和授权问题,需要检查身份和权限
- 502:网关配置或后端服务问题,需要检查服务状态和配置
- 503:临时服务不可用,通常可以重试,需要检查服务状态和资源
在实际工作中,结合日志、监控和调试工具,可以更准确地定位问题根源。