HAProxy反向代理怎么排查?健康检查、超时、会话与TLS终止

先确认工作在TCP还是HTTP模式,再解释状态码、检查结果和连接复用
发布于
7

HAProxy既能在TCP层转发数据库、TLS或其他连接,也能在HTTP层按Host、Path、Header路由。排查前必须确认Frontend、Backend运行在什么模式。TCP模式没有HTTP状态语义;HTTP模式才能检查响应头、状态和应用路径。

TCP与HTTP模式差异

项目 TCP模式 HTTP模式
观察层级 连接与字节流 HTTP方法、头、路径和状态
路由能力 地址、端口及有限内容检查 Host、Path、Header等
健康检查 TCP连通或协议检查 HTTP请求与预期响应
日志 连接时长和字节 HTTP状态、队列与时间字段

健康检查通过为何业务仍失败

健康检查可能只验证端口或简单路径,真实请求却需要数据库、外部API和用户身份。应让检查足够代表服务可用,又不能执行昂贵业务或产生副作用。Readiness与深度业务监控可以分层,避免一个下游波动让所有节点同时被摘除。

检查间隔和阈值怎么设置

过于敏感会因一次抖动频繁上下线,过于宽松则继续向故障节点发送流量。应结合正常延迟、部署启动时间、故障检测目标和后端数量配置rise/fall等阈值,并在灰度环境模拟。

超时必须按阶段理解

客户端、连接、服务端、HTTP请求和隧道等超时含义不同。缺失关键超时可能让连接长期占用资源,设置过短则造成误杀。应从HAProxy日志中的队列、连接、首字节和总会话时间判断瓶颈。

为什么出现排队

Backend或Server最大连接数达到上限时,新请求可能在队列等待。排队不一定意味着CPU满,也可能是数据库连接池、长连接、慢请求或限制值太低。盲目提高maxconn会把压力转移到后端。

会话保持有哪些代价

Cookie、源地址或一致性策略可提高会话稳定性,也会造成负载倾斜。移动网络和共享NAT使源IP保持不够精确;节点故障时会话仍需转移。关键状态应放在共享存储或可恢复Token中。

TLS在哪里终止

HAProxy终止TLS时负责证书、协议和客户端安全,再以HTTP或重新加密连接后端;TLS透传时无法直接读取HTTP内容。两种架构在SNI路由、真实IP、后端证书和日志能力上不同,应明确选择。

真实客户端IP如何传递

HTTP模式可通过受控X-Forwarded-For传递;TCP模式可使用PROXY Protocol,但后端必须支持并只信任HAProxy来源。多层代理解析原则可参考Forwarded、XFF与可信代理链

重试会不会重复写操作

HAProxy可在特定条件下重试或切换后端,但请求是否安全重放取决于方法和业务。POST已发送部分或上游已处理时,重试可能产生重复。应用必须提供幂等机制,代理策略应谨慎限制。

日志与Stats看什么

  • Frontend与Backend会话数;
  • 队列长度和等待时间;
  • 连接、响应和总时长;
  • 终止状态与重试次数;
  • 每个Server健康状态和权重;
  • TLS握手、协议和证书到期。

变更验证顺序

  1. 确认TCP或HTTP模式;
  2. 校验配置语法并保留回滚;
  3. 测试健康、慢响应和故障响应;
  4. 观察队列、连接和高分位延迟;
  5. 模拟单节点下线与重新加入;
  6. 验证会话、真实IP和TLS;
  7. 检查写请求不会被不安全重试。

结论

HAProxy排查的核心是模式与阶段。健康检查、连接队列、会话保持和TLS终止互相影响;用日志时间字段和故障演练验证,远比只看端口是否开放更可靠。

常见问题(FAQ)

HAProxy返回503一定是后端应用宕机吗?
不一定。还可能是所有Server被判定不可用、队列已满、连接限制或路由规则没有匹配。
TCP模式和HTTP模式可以使用相同检查吗?
基础TCP检查可以复用思路,但HTTP检查还能验证路径、Host和状态,配置语义不同。
会话保持能保证用户永远到同一后端吗?
不能。节点下线、Cookie失效、扩缩容或策略变化都可能重新分配,应用不应只依赖本地会话。
启用PROXY Protocol后应用可以直接按HTTP读取吗?
不可以,接收端必须明确支持PROXY Protocol,否则连接开头会被当作无效数据。

本文由作者原创/授权发布于极跃圈(jiyueip.com)未经许可,禁止转载。题图来自Unsplash,基于CC0协议。

声明:极跃圈(JIYUEIP.com)内网友所发表的所有内容及言论仅代表其本人,并不反映任何极跃圈(JIYUEIP.com)之意见及观点。

0 讨论
热门最新
总结
暂无总结
0 / 600