如果 Varnish 位于 HAProxy 和 Apache 之间,如何进行故障转移

如果 Varnish 位于 HAProxy 和 Apache 之间,如何进行故障转移

我正在考虑将 Varnish 置于 HAProxy 和 Apache 之间。这种方法可行,但是使用 Varnish 时,HAProxy 会监控 Varnish。如果 Apache 出现故障,它不会故障转移到另一个 Apache。

HAProxy 中是否有可以解决这个问题的配置?

答案1

如果 Varnish 位于 HAproxy 和 Apache 之间,你可以让 Varnish 执行负载均衡,尽管它不如 HAproxy 提供的选项那么强大。

更好的办法可能是让 HAproxy 将静态内容发送到 Varnish,并将其余内容直接发送到后端服务器。

Haproxy.com 上有一篇关于如何做到这一点的非常好的文章这里

如果你确实希望 HAproxy 检查 Varnish 的状态Apache 同时(位于同一主机上),您有两个选择:

  1. 在 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
    
  2. 让 Varnish 返回与 Apache 状态相匹配的健康检查结果(如果 Apache 启动则返回 OK,否则返回 FAILED)。

    清漆.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配置文件

    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
    

相关内容