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

时间:2015-03-16 08:25:18

标签: amazon-ec2 magento-1.7 varnish cache-invalidation

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

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

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

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

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

此外,可以做些什么来自动化从存储库中获取最新代码期间更改的所有文件的缓存失效?

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

1 个答案:

答案 0 :(得分:2)

我会这样做:

  1. 获取elb的受管节点(describe-load-balancers)并提取这些节点的实例ID
  2. 将以上实例ID保存在数组中
  3. 遍历实例ID数组并提取实例的私有IP地址。
  4. 将这些私有IP地址保存在另一个阵列中
  5. 遍历此阵列,然后通过SSH连接到这些实例并执行缓存失效脚本/命令。
  6. 我在下面提供了一个拉动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。我正在使用jq json解析器来仅提取我想要的信息。