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页面,返回友好的自定义提示:
- 提前编写自定义错误页,存放到路径
/etc/haproxy/errors/503.html - 在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
相关产品推荐
相关产品推荐

