You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HAProxy 1.8.27如何正确处理应用返回的503错误信息

解决方案

1. 优化健康检查规则,自动摘除异常节点

你当前配置的option httpchk默认仅校验后端是否返回2xx/3xx状态码,应用因DB故障挂起时如果OPTIONS请求仍能返回正常状态码,或返回503未被拦截,HAProxy会持续向异常节点转发请求。
修改backend uib配置,补充HTTP状态码校验规则:

backend uib
        mode http
        option httpchk OPTIONS /client
        # 新增:仅当检查接口返回200时判定节点健康
        http-check expect status 200
        option tcp-check
        tcp-check connect port 9200
        tcp-check expect string is\ synced.
        balance source
                server psc1.piszki.lab:8080 192.168.10.41:8080 maxconn 32 check inter 5000 check
                server psc2.piszki.lab:8080 192.168.10.42:8080 maxconn 32 check inter 5000 check backup

调整后当OPTIONS /client返回503等非200状态码时,HAProxy会自动将该节点标记为不可用,流量切到其他健康节点。

2. 配置异常重试机制,用户侧无感知故障转移

如果不需要直接摘除节点,可配置503错误自动重试,将请求转发到其他正常节点:
在backend uib中新增以下配置:

# 最多重试3次
retries 3
# 连接失败、后端返回503时触发重试
retry-on 503 conn-failure

3. 自定义错误页面,优化异常提示

如果所有后端节点均不可用,可配置HAProxy替换后端返回的默认503页面,返回友好的自定义提示:

  1. 提前编写自定义错误页,存放到路径/etc/haproxy/errors/503.html
  2. 在frontend或backend配置中新增规则:
# 拦截后端返回的503响应,替换为自定义页面
http-response deny deny_status 503 content-type text/html file /etc/haproxy/errors/503.html if { status eq 503 }

可选优化

可根据业务需求调低健康检查间隔,让异常节点更快被识别,例如将检查间隔从5000ms调整为2000ms:

server psc1.piszki.lab:8080 192.168.10.41:8080 maxconn 32 check inter 2000 check
server psc2.piszki.lab:8080 192.168.10.42:8080 maxconn 32 check inter 2000 check backup

内容的提问来源于stack exchange,提问作者Agryppa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 15:36:03