在多个实例上使 Varnish 缓存无效

Invalidate Varnish cache on multiple instances

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

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

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

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

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

此外,是否可以做一些事情来自动使所有在从存储库中提取最新代码期间发生更改的文件的缓存失效?

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

我会这样做:

  1. 获取 elb 的托管节点(描述负载均衡器)并拉取这些节点的实例 ID
  2. 将上述实例 ID 保存在一个数组中
  3. 遍历实例 ID 数组并提取实例的私有 IP 地址。
  4. 将这些私有 IP 地址保存在另一个数组中
  5. 遍历此数组,然后通过 SSH 进入这些实例并执行缓存失效 script/commands。

我在下面提供了一种提取 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 命令。

您需要在这里编写一些脚本。所以写一个脚本和 post 另一个问题,以防你遇到任何问题。

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