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"