云负载均衡返回 502,但直连后端正常;健康检查时好时坏,错误呈间歇性。
客户端经云 LB(AWS ALB/CLB、GCP LB、Azure App Gateway、阿里云 SLB 等)访问返回 502,绕过 LB 直连后端正常;健康检查可能间歇失败,错误集中在发布、扩缩容或空闲之后。
先看 LB 侧日志/target 状态,判断 502 是 LB 生成还是后端返回:
aws elbv2 describe-target-health --target-group-arn <tg-arn> --output table
aws s3 cp s3://<alb-log-bucket>/AWSLogs/<account>/elasticloadbalancing/<region>/<date>/<file>.log.gz - | zcat | awk '{print $9, $10}' | sort | uniq -c | sort -nr | head
gcloud compute backend-services get-health <backend-service> --global
gcloud logging read 'resource.type="http_load_balancer" AND jsonPayload.statusDetails!=""' --limit 20 --format json
az network application-gateway show-backend-health -g <rg> -n <gateway>
aliyun slb DescribeHealthStatus --LoadBalancerId <lb-id>
ALB 访问日志中 elb_status_code 是 LB 返回码,target_status_code 是后端返回码;- 表示没拿到响应。CloudWatch 同时对比 HTTPCode_ELB_502_Count 与 HTTPCode_Target_5XX_Count。
再从 VPC 内直连 target,验证安全组和协议:
curl -v --resolve app.example.com:443:<target-ip> https://app.example.com/health
ss -lntp | grep ':<target-port>'
易误判:HTTPCode_ELB_502_Count 是 LB 自己生成的 502(连接失败/响应非法),HTTPCode_Target_5XX_Count 才是后端返回的 5xx;两者根因完全不同。健康检查从 LB 所在子网发起,安全组只放行客户端网段会误杀;NLB 是四层,不产生 HTTP 502,经 NLB 看到的 502 来自后端。
target_status_code 为 5xx 或无响应。target_status_code 为 - 查连接与安全组,为 5xx 查应用。HTTPCode_ELB_502_Count 与 HTTPCode_Target_5XX_Count 有什么区别?target_status_code 为 - 说明什么?