You need to enable JavaScript to run this app. Docker搭建Spring Boot负载均衡Demo时HAProxy返回503错误如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

Docker搭建Spring Boot负载均衡Demo时HAProxy返回503错误如何解决?

错误根因定位

你遇到的503错误是HAProxy配置错误导致无法正常转发请求到Spring Boot实例,核心问题有3个:

  • 后端服务配置未指定端口:Spring Boot容器内服务运行在8080端口,你当前配置只写了服务名,HAProxy默认访问80端口,无法命中服务
  • 后端节点ID重复:两个server配置都用了node1作为节点ID,配置冲突导致节点全部失效
  • 缺少健康检查配置:无法自动识别实例可用状态,不符合你后续模拟故障验证负载均衡的需求

修复方案

1. 替换haproxy.cfg为以下配置

global
    daemon
    log /srv/logs/haproxy local0
    log /srv/logs/haproxy local1 notice

defaults
    mode http
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms
    option http-keep-alive

frontend http-in
    bind :80
    acl host_web1 hdr(host) -i 127.0.0.1
    use_backend web1_be if host_web1

backend web1_be
    http-request set-header X-Forwarded-Port %[dst_port]
    http-request add-header X-Forwarded-Proto https if { ssl_fc }
    balance roundrobin
    server node1 web1_app:8080 check inter 2000 fall 2 rise 2 weight 1
    server node2 web2_app:8080 check inter 2000 fall 2 rise 2 weight 1

改动说明:

  • 给两个服务补充了8080端口
  • 节点ID分别修改为node1、node2避免冲突
  • 新增balance roundrobin指定轮询负载策略
  • 新增check相关配置开启健康检查,2秒检测一次,连续2次失败标记节点不可用,连续2次成功恢复可用

2. 重启服务验证

先清理原有容器,再按顺序启动避免服务未就绪问题:

# 停止并删除所有旧容器
docker-compose down
# 先启动数据库和web应用,等待10秒保证Spring Boot初始化完成
docker-compose up -d database web1_app web2_app
sleep 10
# 最后启动HAProxy
docker-compose up -d haproxy

3. 负载均衡验证方法

你可以先给Spring Boot新增一个简单的测试接口,返回当前实例标识:

@GetMapping("/api/instance")
public String getInstance() {
    // 也可以返回容器hostname,自动区分不同实例
    return System.getenv().getOrDefault("HOSTNAME", "unknown");
}

多次访问http://localhost/api/instance,会交替返回web1_app和web2_app的容器ID,证明轮询负载均衡生效。

4. 模拟延迟故障验证

要模拟部分容器延迟,直接对目标容器执行流量控制命令即可:

# 给web1_app添加2秒延迟
docker exec -it web1_app tc qdisc add dev eth0 root netem delay 2000ms

此时再访问接口,会发现大部分请求都被转发到无延迟的web2_app,连续多次失败后HAProxy会自动剔除web1_app节点,所有请求都走web2_app。要恢复web1_app的延迟执行:

docker exec -it web1_app tc qdisc del dev eth0 root netem

兜底排查方法

如果修改后仍然报错,按以下步骤排查:

  1. 进入HAProxy容器验证网络连通性:docker exec -it haproxy ping web1_app,如果ping不通检查docker-compose的网络配置,确认haproxy和web服务在同一个网络下
  2. 直接在HAProxy容器内调用Spring Boot接口:docker exec -it haproxy curl http://web1_app:8080/api/instance,如果返回失败检查Spring Boot应用本身的启动日志和接口配置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 06:15:08