簡體   English   中英

使多個實例上的Varnish緩存無效

[英]Invalidate Varnish cache on multiple instances

我們正在AWS上運行Magento存儲,並且在ELB后面具有自動縮放設置。 在任何時候,我們至少有2台Web服務器正在運行。 每個Web服務器實例在其前面都有自己的Varnish Cache服務器,用於處理傳入的請求。

現在,問題是,一旦我們更改了一些靜態內容(如CSS,圖像等),我們就必須通過SSH進入每個前端EC2實例,並禁止Varnish緩存對象。 這確實很麻煩,因為我們首先必須從AWS控制台手動獲取實例的IP,然后以SSH方式將其輸入到它們中,這會花費很多時間,而且如果我們隨時有2-3台以上的服務器,效率會很低。

我考慮通過Phoenix Media安裝PageCache擴展,但是它們的模塊存在的問題是,我們仍然必須在我們事先不知道的配置中手動輸入清漆實例IP的靜態列表。 在我們的情況下,這是行不通的,因為自動縮放服務器隨處可見。

有沒有一種方法可以一次為所有正在運行的前端服務器設置緩存失效? 我已在默認VCL文件中添加了所需的代碼段,該文件允許從同一子網中的任何實例清除/禁止。 對於所有管理任務,我們都有專用的EC2,我計划使用該EC2向所有前端服務器發出緩存失效請求。

我當時在想,也許我可以編寫一個Shell腳本並使用AWS API獲取所有前端實例的IP列表,然后對所有實例發出ban命令。 這樣行嗎? 如何設置?

另外,是否可以做一些事情來使所有在最新代碼從存儲庫中提取期間更改的文件的緩存失效自動進行?

解決此問題的最有效方法是什么?

這就是我會做的:

  1. 獲取elb的受管節點(描述負載均衡器)並提取這些節點的實例ID
  2. 將以上實例ID保存在數組中
  3. 循環遍歷實例ID數組並提取實例的Private Ip地址。
  4. 將這些私有IP地址保存在另一個陣列中
  5. 循環訪問此陣列,然后通過SSH進入這些實例並執行您的緩存失效腳本/命令。

我在下面提供一種提取ELB受管節點的私有IP地址的簡要方法。 這僅是為了使您熟悉應該使用的特定AWS API:

我為此使用AWS CLI:

運行以下命令以提取實例ID:

# aws elb describe-load-balancers --load-balancer-names my-elb | jq '.LoadBalancerDescriptions[].Instances[].InstanceId'
"i-12345678"
"i-87654321"

有了實例ID后,請運行以下命令提取單個實例的私有IP地址:

# aws ec2 describe-instances --instance-ids i-12345678 i-87654321 | jq '.Reservations[].Instances[].PrivateIpAddress'
"10.0.1.1"
"10.0.1.2"

現在,您具有ELB受管節點的IP地址。 因此,循環遍歷此列表,將ssh插入ode並運行您的清漆命令。

您需要在此處做一些腳本編寫。 因此,編寫腳本並發布另一個問題,以防您遇到任何問題。

我上面使用的AWS API是describe-load-balancersdescribe-instances 而且我正在使用jq json解析器僅提取我想要的信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM