首页/网络/网络排障速查/反向代理层排查:区分代理慢与后端慢

反向代理层排查:区分代理慢与后端慢

代理夹在客户端与后端之间:先用日志里的 upstream 耗时把责任切开,再往客户端侧或后端侧走,避免在两层之间来回猜。

网络排障速查网络更新于 2026-10-13

把代理与后端切开

反向代理(Nginx、HAProxy、云 SLB)夹在客户端与后端之间,故障时长出现两种完全相反的判断:「代理转发有问题」与「后端处理慢」。切开责任最有效的办法是对照测试:一次直连后端、一次经代理,比较耗时与状态码;再看 nginx 日志里的 $request_time 与 $upstream_response_time 差值——差值大是代理或网络段的问题,upstream 值大才是后端慢。

基本信息

适用平台Nginx / HAProxy / 云 SLB + 后端应用
关键字段$request_time、$upstream_response_time、$upstream_status、$upstream_addr
对照手段curl 直连后端与经代理各测一次,注意带 Host 头
日志开关log_format 里显式加上 upstream 相关变量才可判读
权限要求查看后端监听需后端主机权限;读日志需相应文件权限

典型使用场景

  • 用户报「网站慢」:先确认慢在代理转发还是后端处理
  • 出现 502/504:用 $upstream_status 判断是后端拒连、超时还是返回了错误码
  • 多后端负载均衡:确认请求是否打到了预期的那台后端
  • 代理自身 CPU 高导致的排队:用 request_time 与 upstream 差值识别
  • 变更网关配置后回归验证:对照直连与经代理的结果差异

对照与取证

对照与取证
# 直连后端(绕开代理),拿到基准耗时
curl -sS -o /dev/null -w 'direct %{http_code} %{time_total}\n' http://127.0.0.1:8080/api/health
# 经代理访问,注意 Host 必须与站点配置一致,否则命中默认站点
curl -sS -o /dev/null -w 'proxy  %{http_code} %{time_total}\n' -H 'Host: api.example.com' http://10.0.0.5/api/health
# 分段耗时:连接、首字节、总时间
tail -50 /var/log/nginx/error.log
grep 'upstream' /var/log/nginx/error.log | tail -20
# 建议在 access log 里显式记录:$request_time $upstream_response_time $upstream_status $upstream_addr

日志字段判读

字段含义判读要点
$request_time从收到请求到响应完成的总耗时与 upstream 值差距大说明时间花在代理或客户端侧
$upstream_response_time后端响应耗时,多个后端时用逗号分隔该值大即后端慢,责任明确
$upstream_status后端返回的状态码502/504 指向后端不可用或超时
$upstream_addr命中的后端地址多后端场景确认请求打到哪台
$upstream_connect_time与后端建连耗时数值大说明建连慢,可能是后端 backlog 满
日志里没有 upstream 相关字段就先补进 log_format 再复现:有这组字段,代理自身慢与后端慢一眼可分,没有就只能靠猜。

易错点

  • 只看请求总耗时不区分代理自身与应用处理时间:把后端慢误判为代理问题,改错层的配置
  • 经代理测试不带 Host 头:请求被当成默认站点处理,返回的结果与真实业务无关,结论无效
  • 忽略 $upstream_addr:多后端场景下以为所有后端都慢,实际只是一台异常节点在拉低整体
  • 在后端本机用 127.0.0.1 测试就宣布正常:绕过了代理与网络路径,客户端侧的问题被掩盖

数据来源与参考

  • nginx 文档:ngx_http_upstream_module(upstream_response_time)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌