【问题标题】:how to prevent 502 status code as response by haproxy as load balancer如何防止 502 状态代码作为 haproxy 作为负载均衡器的响应
【发布时间】:2023-08-07 13:07:01
【问题描述】:

我有 3 个服务器:

server (A)= a nginx(port 80) as reverse proxy to kestler (5000 port)
server (B)= a nginx(port 80) as reverse proxy to kestler (5000 port)
server (C)= a HAProxy as load balancer for port 80 of server (A) and (B)
and server A & B are quite similar.

每件事都运行良好,haproxy 将请求转发到服务器 (A) 和 (B),但是如果其中一台服务器(例如 A)中的 kestrel 被杀死,nginx 会响应 502 bad gateway error 并且 haproxy 没有检测到这个问题并且仍然将请求重定向到它,这是错误的!它必须在这段时间内将请求重定向到服务器(B)。

global
    log 127.0.0.1 local2 info
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

defaults
    log global
    mode http
    option httplog
    option dontlognull
    option redispatch
    retries 3
    timeout connect 5s
    timeout client 50s
    timeout server 50s
    stats enable
    stats hide-version
    stats auth admin:admin
    stats refresh 10s
    stats uri /stat?stats

frontend http_front
    bind *:80
    mode http
    option httpclose
    option forwardfor
    reqadd X-Forwarded-Proto:\ http
    default_backend http_back

backend http_back
    balance roundrobin
    mode http
    cookie SERVERID insert indirect nocache
    server ServerA 192.168.1.2:80 check cookie ServerA
    server ServerB 192.168.1.3:80 check cookie ServerB

我该如何解决这个问题? 非常感谢。

【问题讨论】:

  • 您的 HAProxy 健康检查是如何配置的?如果它们不是配置为通过 Nginx 到达并由 kestrel 响应的路径的 HTTP 检查,这是可以预期的。
  • 我的 haproxy 配置已添加到我的帖子中。请检查一下。非常感谢@Michael - sqlbot

标签: haproxy failover nginx-reverse-proxy kestrel bad-gateway


【解决方案1】:

您只是检查 nginx 是否正在运行,而不是检查应用程序是否足够健康。

backend 中,添加option httpchk

option httpchk GET /some/path HTTP/1.1\r\nHost:\ example.com

some path 替换为一个路径,该路径将证明应用程序在该服务器上是否可用,如果它返回200 OK(或任何2xx 或3xx 响应),并将example.com 替换为应用程序的HTTP Host 标头预计。

option httpchk

默认情况下,服务器健康检查只包括尝试建立 TCP 连接。指定option httpchk时,一旦TCP连接建立,就会发送一个完整的HTTP请求,响应2xx和3xx 被认为是有效的,而所有其他的都表示服务器故障,包括没有任何响应。

如果应用程序不健康,这会将服务器标记为不健康,因此 HAProxy 将停止向其发送流量。您将需要使用每个服务器条目上的 interdowninterfastinter 选项为每个服务器配置检查间隔,以指定 HAProxy 应该多久执行一次检查。

【讨论】:

  • 已解决。非常感谢。 @Michael - sqlbot
最近更新 更多