amazon-ec2 - 使多个实例上的 Varnish 缓存无效

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

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

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

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

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

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

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

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

最佳答案

这就是我会做的:

  1. 获取 elb 的托管节点(describe-load-balancers)并提取这些节点的实例 ID
  2. 将以上实例 ID 保存在数组中
  3. 循环实例 ID 数组并提取实例的私有(private) IP 地址。
  4. 将这些私有(private) IP 地址保存在另一个数组中
  5. 循环访问该数组,然后通过 SSH 连接到这些实例并执行缓存失效脚本/命令。

我在下面提供了一种提取 ELB 受管节点的私有(private) 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,请运行以下命令来提取单个实例的私有(private) 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 解析器仅提取我想要的信息。

关于amazon-ec2 - 使多个实例上的 Varnish 缓存无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29072341/

相关文章:

linux - 亚马逊 EC2 : Host does not exist

ssl - 您可以通过 .ebextensions 文件配置 Elastic Beanstalk Load Balancer SSL 证书吗?

magento - 如何限制magento管理表单中的字符数

magento - 在 Magento 中,观察者到底是什么?它有什么作用?

regex - Varnish :在替换字符串中使用来自正则表达式的匹配

varnish - 如何获取 vcl_backend_response 中的 req.url?

daemon - Varnish DAEMON_OPTS 选项错误

amazon-web-services - 在本地测试使用 IAM 角色的应用程序

android - 由于jenkins触发的aws实例未接受某些许可证,因此无法安装以下Android SDK软件包

php - 在 Magento 商店中更改字体