Load-Balancing

在同一個 Varnish 伺服器後面執行 Drupal 和 Django 站點的最佳方式是什麼?

  • September 13, 2012

我有一個使用 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;
    }
}

歡迎所有建議。

謝謝!

我又讀了幾次 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 將使用 Director 為 Drupal 伺服器提供所有內容,除了以 /new-section 開頭的 URL,它將由 Director 為 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;
   }
}

我認為req.backend的使用令人困惑,應該有類似req.director的東西來使其更清晰。

引用自:https://serverfault.com/questions/424709