在同一 Varnish 服务器后面运行 Drupal 和 Django 站点的最佳方法是什么?

在同一 Varnish 服务器后面运行 Drupal 和 Django 站点的最佳方法是什么?

我有一个高流量网站,使用 Drupal 和 Apache 运行,在 Varnish 服务器负载平衡后面有五台 Web 服务器。假设此网站是 example.com。我在 default.vcl 中使用了五个后端和一个像这样的主管:

director balancer round-robin {
  {
   .backend = web1;
  }
  {
  .backend = web2;
  }
  {
  .backend = web3;
  }
  {
  .backend = web4;
  }
  {
  .backend = web5;
  }
}

现在,我正在开发一个新的 Django 项目,它将成为该网站在 example.com/new-section 上运行的一个新部分。

检查后文档我发现我可以做这样的事情:

sub vcl_recv {
     if (req.url ~ "^/new-section/") {
         set req.backend = newbackend;
     } else {
         set req.backend = default;
     }
}

也就是说,对同一域下的子目录 /new-section 使用不同的后端。

我的问题是,如何使这样的事情与我的导演和负载平衡设置一起工作?

我可能会在我的新的 Django 项目中运行两个或更多个 Web 服务器(后端),每个服务器都混合了 Gunicorn、Nginx 和一些 Python 包,并且希望将它们全部放在自己的 Varnish 管理器中以实现负载平衡。

是否可以使用上述方法来决定使用哪个导演?就像这样:

sub vcl_recv {
     if (req.url ~ "^/new-section/") {
         set req.director = newdirector;
     } else {
         set req.director = balancer;
     }
}

欢迎一切建议。

谢谢!

答案1

我又读了几遍 Varnish 的文档,开始尝试我的本地设置,终于成功了。Varnish(至少是 2.1 版,我用于测试的版本)将导演视为后端,因此您可以检查 set request.backend,这将设置要使用的正确导演。所以我这样做了:

if (req.url ~ "^/new-section") {
   set req.backend = django_balancer;
} else {
   set req.backend = balancer;
}

在哪里django_balancer是否以与我的原作类似的方式创作了新导演平衡器(请参阅问题中的详细信息)。显然,这个新的主管必须指向为 Django 项目服务的 Web 服务器。

现在,Varnish 将使用主管为 Drupal 服务器提供所有内容,但以 /new-section 开头的 URL 除外,这些 URL 将由主管为 Django 服务器提供服务。

default.vcl 中有一些额外的设置,以便 Drupal 和 Django 能够使用 Varnish 正确处理 cookie,但这是另一个问题,网上已经有一些资源详细介绍了如何处理它。

顺便说一句,我得到了以下提示Varnish 关于负载均衡的 wiki 页面,这是关键部分:

 You can send traffic to your brand new director in vcl_recv, like this:

 sub vcl_recv {
    if (req.http.host ~ "^(www.)?mysite.com$") {
      set req.backend = baz;
    }
 }

我认为使用请求后端令人困惑,应该有类似的东西请求目录使其更清晰。

相关内容