1

我们在 AWS 上运行我们的 Magento 商店,并且我们在 ELB 后面设置了自动缩放设置。在任何时候,我们至少有 2 个 Web 服务器在运行。每个 Web 服务器实例在其前面都有自己的 Varnish Cache 服务器来处理传入的请求。

现在,问题是一旦我们更改了一些静态内容,如 CSS、图像等,我们必须通过 SSH 连接到每个前端 EC2 实例并禁止 Varnish 缓存的对象。这真的很麻烦,因为我们首先必须从 AWS 控制台手动获取实例的 IP,然后通过 SSH 进入它们,如果我们随时拥有超过 2-3 台服务器,这会花费大量时间并且效率不高。

我研究了由 Phoenix Media 安装 PageCache 扩展,但他们模块的问题是我们仍然必须在我们事先不知道的配置中手动输入 varnish 实例的静态 IP 列表。这在我们的案例中不起作用,因为自动缩放服务器来来去去。

有没有一种方法可以一次为所有正在运行的前端服务器设置缓存失效?我在默认 VCL 文件中添加了所需的代码,它允许从同一子网中的任何实例中清除/禁止。对于所有管理任务,我们都有一个专用的 EC2,我计划使用它来向所有前端服务器发出缓存失效请求。

我在想,也许我可以编写一个 shell 脚本并使用 AWS API 获取所有前端实例的 IP 列表,然后向所有这些实例发出禁令命令。这行得通吗?如何设置它?

此外,是否可以采取措施自动使在从存储库中提取最新代码期间更改的所有文件的缓存失效?

解决此问题的最有效方法是什么?

4

1 回答 1

3

我会这样做:

  1. 获取 elb 的托管节点(describe-load-balancers)并拉取这些节点的实例 ID
  2. 将上述实例 ID 保存在数组中
  3. 遍历实例 ID 数组并提取实例的私有 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 并运行你的 varnish 命令。

您需要在这里编写一些脚本。因此,如果您遇到任何问题,请编写一个脚本并发布另一个问题。

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

于 2015-03-16T13:27:28.527 回答