HTTP 故障定位手册
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
HTTP(Hypertext Transfer Protocol,超文本传输协议)排障先找失败在哪一跳、由谁返回,再修改配置。保留故障发生时间、入口、路径模板、状态码、请求 ID 和影响比例。
1. 第一轮证据#
准备真实预发布入口的无副作用路径;curl 不带业务凭证,不自动跟随跳转。
export PROBE_URL='https://api.staging.example.com/health/ready'
umask 077
HTTP_WORK=$(mktemp -d)
curl -sS --connect-timeout 3 --max-time 15 -D "$HTTP_WORK/headers" -o /dev/null -w 'code=%{http_code} ip=%{remote_ip} version=%{http_version} dns=%{time_namelookup} connect=%{time_connect} tls=%{time_appconnect} first=%{time_starttransfer} total=%{time_total}\n' "$PROBE_URL" > "$HTTP_WORK/timing"
CURL_RC=$?
printf 'curl_exit=%s\n' "$CURL_RC"
cat "$HTTP_WORK/timing" "$HTTP_WORK/headers"在交互 Bash 执行,预期故障检查不启用 set -e。curl 退出码与 HTTP 状态不同:不用 --fail 时 HTTP 500 仍可能退出 0;000 不是服务端 HTTP 状态。
| 证据 | 下一步 |
|---|---|
| curl 6 | DNS(Domain Name System,域名系统)解析失败;检查解析环境 |
| curl 7 | 连接失败;端口、路由、防火墙、监听与地址族 |
| curl 28 | 超时;结合阶段计时,不只增加 timeout |
| curl 35/60 | TLS(Transport Layer Security,传输层安全)协商/证书验证问题 |
| HTTP 502/504 | 代理错误日志、上游地址、连接/读取阶段 |
| HTTP 503 | 容量、限流、健康目标和应用主动拒绝 |
| 浏览器失败但 curl 成功 | 跨域、混合内容、浏览器证书库、缓存、扩展/Service Worker |
具体退出码见 curl 官方说明。
2. Hands-on:区分入口故障与上游故障#
先启动 隔离实验环境:
for path in health unavailable broken; do
curl -sS --max-time 5 -o /dev/null -w "$path status=%{http_code} total=%{time_total}\n" "http://127.0.0.1:18080/$path"
done
docker logs "$HTTP_LAB_NAME" --tail 20预期 200/503/502。比较日志里的 status、upstream_status、upstream_time:主动返回 503 不等于真实上游超时;502 由连接拒绝触发。真实 504 要结合 upstream timed out 等证据,不能仅用返回固定 504 的端点冒充超时实验。
3. 生产代理日志至少包含什么#
Nginx 诊断配置在专题首页,记录 URI 路径、不记 query、Cookie、Authorization 和正文。生产还需路径模板/采样以限制敏感数据和高基数。
| 字段 | 用途 |
|---|---|
| request_id、time | 关联用户报告与服务端事件 |
| status、upstream_status | 区分最终响应与上游尝试;多次尝试可能为列表 |
| request_time | 入口观测总耗时,可能受客户端上传/下载影响 |
| upstream_connect_time、upstream_header_time、upstream_response_time | 上游连接、响应头、完整响应耗时 |
ALB(Application Load Balancer,应用负载均衡器)应同时看 elb_status_code 与 target_status_code、目标健康和访问日志,详见 ALB Monitoring。没有应用日志不能直接证明请求没到达:先排除采样、时间偏差和日志丢失。
4. 按症状收敛#
- 偶发 502:关联发布、后端关闭连接、连接池复用、响应头格式;不要只看 CPU。
- 约固定秒数失败:列出所有层的连接/读取/总截止时间,找匹配阈值。
- 首字节快但下载慢:检查响应大小、压缩、缓冲、带宽和客户端接收能力。
- 只部分用户失败:比较地域、IPv4/IPv6、代理、Cookie 大小、CDN 节点和协议版本。
- 登录循环:检查外部协议识别、Cookie 域/路径/SameSite、Location;不要把跨域重定向当普通 JSON 响应。
每次只改一层配置,保存原值。恢复后同时验证故障路径、正常业务、错误率和延迟;结束删除临时证据中的凭证,按留存策略保存脱敏信息。相关:生命周期、超时与重试、浏览器跨域。