我有一个高流量网站,使用 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;
}
}
我认为使用请求后端令人困惑,应该有类似的东西请求目录使其更清晰。