1

我有 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

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

4

1 回答 1

1

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

在 中backend,添加option httpchk

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

如果应用程序返回(或任何 2xx 或 3xx 响应),则替换为将证明应用程序在该服务器上是否可用的路径,并替换为some path应用程序期望的 HTTP标头。200 OKexample.comHost

option httpchk

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

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

于 2018-05-31T08:00:19.150 回答