Define backup backend in HAProxy configuration to choose used backend depending on the number of usable servers.

HAProxy version.

$ haproxy -v
HA-Proxy version 1.7.5-2 2017/05/17
Copyright 2000-2017 Willy Tarreau <willy@haproxy.org>

Default HAProxy configuration.

global
	log /dev/log	local0
	log /dev/log	local1 notice
	chroot /var/lib/haproxy
	stats socket /run/haproxy/admin.sock mode 660 level admin
	stats timeout 30s
	user haproxy
	group haproxy
	daemon
	# Default SSL material locations
	ca-base /etc/ssl/certs
	crt-base /etc/ssl/private
	# Default ciphers to use on SSL-enabled listening sockets.
	# For more information, see ciphers(1SSL). This list is from:
	#  https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
	# An alternative list with additional directives can be obtained from
	#  https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy
	ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
	ssl-default-bind-options no-sslv3
defaults
	log	global
	mode	http
	option	httplog
	option	dontlognull
        timeout connect 5000
        timeout client  50000
        timeout server  50000
	errorfile 400 /etc/haproxy/errors/400.http
	errorfile 403 /etc/haproxy/errors/403.http
	errorfile 408 /etc/haproxy/errors/408.http
	errorfile 500 /etc/haproxy/errors/500.http
	errorfile 502 /etc/haproxy/errors/502.http
	errorfile 503 /etc/haproxy/errors/503.http
	errorfile 504 /etc/haproxy/errors/504.http

Use nbsrv method to get the number of usable servers for given backend and create required ACL rule.

acl is-example-org hdr_dom(host) -i example.org
acl is-example-org-backend-dead nbsrv(example-org-backend) lt 1
use_backend example-org-secondary-backend if is-example-org  is-example-org-backend-dead
use_backend example-org-backend           if is-example-org

Sample frontend and backend using the specified ACL rule.

frontend web
  bind :80
  #bind :443 ssl crt /etc/ssl/cert/
  option httplog
  option forwardfor except 127.0.0.1
  option forwardfor header X-Real-IP
  #redirect scheme https code 301 if !{ ssl_fc }
  acl is-example-org hdr_dom(host) -i example.org
  acl is-example-org-backend-dead nbsrv(example-org-backend) lt 1
  use_backend example-org-secondary-backend if is-example-org is-example-org-backend-dead
  use_backend example-org-backend           if is-example-org
backend example-org-backend
  mode http
  server example-server-1 10.0.10.15:80
  server example-server-2 10.0.10.16:80
backend example-org-secondary-backend
  mode http
  server example-secondary-server-1 10.0.10.17:80
  server example-secondary-server-2 10.0.10.18:80

Requests will be directed to the example-org-backend backend by default.

Jan 25 15:35:09 example haproxy[721]: 10.66.91.165:42384 [25/Jan/2018:19:35:09.443] web example-org-backend/example-server-1 0/0/0/4/4 200 9386 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1"

Request will be directed to the example-org-secondary-backend backend when the first one goes down.

Jan 25 15:36:29 example haproxy[721]: 10.66.91.165:42666 [25/Jan/2018:19:36:29.315] web example-org-secondary-backend/example-secondary-server-1 0/0/0/0/0 200 28948 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1"