我们在AWS上运行我们的Magento商店,我们在ELB后面进行了自动扩展设置。在任何时候,我们都有至少 2 台 Web 服务器在运行。每个 Web 服务器实例在它前面都有自己的 Varnish Cache 服务器来处理传入的请求。
现在,问题是一旦我们更改了一些静态内容,如CSS,图像等,我们必须通过SSH连接到每个前端EC2实例,并禁止Varnish中的缓存对象。这真的很麻烦,因为我们首先必须从 AWS 控制台手动获取实例的 IP,然后通过 SSH 连接到它们,如果我们在任何时候拥有超过 2-3 台服务器,这需要花费大量时间并且效率不高。
我考虑过通过 Phoenix Media 安装 PageCache 扩展,但他们的模块的问题在于我们仍然必须在我们事先不知道的配置中手动输入清漆实例的 IP 静态列表。这在我们的例子中不起作用,因为自动缩放服务器来来去去。
有没有办法一次为所有正在运行的前端服务器设置缓存失效?我已经在默认的VCL文件中添加了所需的代码段,该文件允许从同一子网中的任何实例清除/禁止。对于所有管理任务,我们有一个专用的 EC2,我计划使用它向所有前端服务器发出缓存失效请求。
我在想,也许我可以编写一个 shell 脚本并使用 AWS API 获取所有前端实例的 IP 列表,并向所有这些实例发出 ban 命令。这行得通吗?如何设置它?
另外,是否可以采取一些措施来自动使在从存储库中提取最新代码期间更改的所有文件的缓存失效?
解决此问题的最有效方法是什么?
这就是我会做的:
- 获取 elb 的托管式节点(描述负载均衡器)并拉取这些节点的实例 ID
- 将上述实例 ID 保存在数组中
- 循环访问实例 ID 数组并拉取实例的私有 IP 地址。
- 将这些专用 IP 地址保存在另一个阵列中
- 遍历此数组,然后通过 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 进入颂歌并运行清漆命令。
您需要在此处执行一些脚本编写。因此,编写脚本并发布另一个问题,以防遇到任何问题。
我上面使用的 AWS API 是describe-load-balancers
和describe-instances
。而且我正在使用jq
json解析器来仅提取我想要的信息。