在同一個 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; } }
歡迎所有建議。
謝謝!
我又讀了幾次 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的東西來使其更清晰。