Я настраиваю HAProxy только перед двумя внутренними серверами с определенной конфигурацией: любой запрос должен поступать на сервер A; но если сервер A возвращает код ошибки 5xx, все запросы должны поступать на резервный сервер B. Когда A возвращает "вверх", все запросы должны поступать на A.
Я пробую эту конфигурацию:
backend example_cluster
balance roundrobin
option httpclose
option forwardfor
option httpchk HEAD /ping.html HTTP/1.0\r\nHost:www.example.com
http-check disable-on-404
default-server error-limit 1 on-error mark-down
redirect scheme https if !{ ssl_fc }
server node1 1.2.3.4:80 check observe layer7
server node_back 5.6.7.8:443 backup ssl verify none
Но это не работает по двум причинам:
Если я удалю строку «option httpchk» и две строки чуть ниже нее; и я также удаляю «уровень наблюдения 7» на сервере A; HAProxy работает, направляя все запросы на узел A. Но, очевидно, когда сервер A возвращает 500, HAProxy не переключается на B. Итак, я предполагаю, что проблема может быть в конфигурации опции httpchk.
Из официальной документации: Активная пассивная балансировка нагрузки с HAProxy
defaults
mode http
option http-server-close
timeout client 20s
timeout server 20s
timeout connect 4s
frontend ft_app
bind 10.0.0.100:80 name app
default_backend bk_app
backend bk_app
server s1 10.0.0.1:80 check
server s2 10.0.0.2:80 check backup
Кстати, я нашел конфигурацию pre-nginx для своего haproxy, и я думаю, вам стоит попробовать:
frontend foo
bind 192.168.0.1:9080
option httpchk
default_backend bar-web
backend bar-web
mode http
balance roundrobin
server bar1 192.168.1.2:9080 check observe layer4 weight 50
server bar2 192.168.1.3:9080 check observe layer4 weight 50