Я подумываю поставить Varnish между HAProxy и Apache. Это работает, однако с Varnish между ними HAProxy отслеживает Varnish. Если Apache выйдет из строя, он не переключится на другой Apache.
Есть ли в HAProxy конфигурация, которая решит эту проблему?
Если Varnish находится между HAproxy и Apache, вы можете просто использовать Varnish для балансировки нагрузки, хотя и далеко не так надежен, как варианты, предоставляемые HAproxy.
Было бы лучше, если бы HAproxy отправлял статический контент в Varnish, а остальное прямо на внутренние серверы.
На Haproxy.com есть очень хорошая статья о том, как это сделать. Вот.
Если вы действительно хотите, чтобы HAproxy проверял статус Varnish и В то же время Apache (которые находятся на одном хосте) у вас есть два варианта:
Настройте фиктивные бэкенды / серверы в HAProxy, которые проверяют Apache и позволяют соответствующему серверу Varnish отслеживать фиктивный сервер:
frontend HTTP-IN
mode http
default_backend Varnishes
# All traffic goes here
backend Varnishes
mode http
balance roundrobin
server Varnish-1 1.1.1.1:80 track Apache-1/Apache-1
server Varnish-2 2.2.2.2:80 track Apache-2/Apache-2
# No traffic ever goes here
# Just used for taking servers out of rotation in 'backend Varnishes'
backend Apache-1
server Apache-1 1.1.1.1:8080 check
backend Apache-2
server Apache-2 2.2.2.2:8080 check
Сделайте так, чтобы Varnish возвращал результат проверки работоспособности, соответствующий статусу Apache (ОК, если Apache запущен, в противном случае ОТКАЗ).
varnish.vcl
backend default {
.host = "127.0.0.1";
.port = "8080";
}
# Health Check
if (req.url == "/varnishcheck") {
if (req.backend.healthy) {
return(synth(751, "OK!"));
} else {
return(synth(752, "FAILED!"));
}
}
sub vcl_synth {
# Health Checks
if (resp.status == 751) {
set resp.status = 200;
return (deliver);
}
if (resp.status == 752) {
set resp.status = 503;
return (deliver);
}
}
haproxy.cfg
frontend HTTP-IN
mode http
default_backend Varnishes
backend Varnishes
mode http
balance roundrobin
option httpchk HEAD /varnishcheck
http-check expect status 200
server Varnish-1 1.1.1.1:80 check
server Varnish-2 2.2.2.2:80 check