当前位置: 首页 > 知识库问答 >
问题:

Cloudfront正在从nginx缓存404,以获取源服务器上确实存在的资产

段干宾白
2023-03-14

我一直在修修补补,为运行在nginx后面的rails应用程序设置多个云前端endpoint,以提高页面加载时间。基本上——我们之前设置了一个endpoint,看起来运行良好,但是当我使用以下声明添加第二个endpointasset_host:

config.action_controller.asset_host = Proc.new do |source|
    hosts = ["https://url1.cloudfront.net", "https://url2.cloudfront.net"]
    hosts[source.hash % 2]
end

每当我部署(使用非常普通的capistrano部署脚本)时,一些资产都不会加载——cloudfront正在缓存nginx 404页面。如果我使cloudfront的缓存失效,所有资产都可以正常加载。

capistrano脚本本身在重新启动Unicorn之前就进行了编译,因此不应该有HTML被提供给新的资产文件名的引用,然而,在部署后立即缓存404s。

我当然不能在每次部署后使cloudfront缓存失效,这需要很长时间。有人遇到过这个问题吗?对如何解决这个问题有什么建议吗?

共有1个答案

欧阳飞章
2023-03-14

我弄明白了。事实证明,我们的预加载和资产更改监控endpoint(当资产发生更改并需要重新加载时,它会向前端报告)是根据磁盘上的摘要列表进行测试的。很自然地,磁盘上的摘要可以超过所有机器上实际编译的摘要,导致浏览器在资产实际准备就绪之前尝试获取资产。

对于其他使用这种技术来测试资产变化的人,我是否可以建议在存储在以下位置的应用程序中使用哈希:

MyAppNamespace::Application.config.assets.digests

希望这能帮助别人!

[更新]实际上,问题的真正根源是使用: hash方法来确定要服务的网址——虽然该方法的输出在单个进程中是一致的——但不会跨进程,因此不同的服务器服务于不同的hash,并且由于它们都在平衡器后面,并非所有服务器都有被请求的资产。

 类似资料:
  • 一直在我的 SSO 项目中集成 Kerberos 身份验证。遇到了一个奇特的场景。 我创建了一个新用户并为其附加了一个 SPN。按照这个问题的步骤进行操作,让一切正常。我的意思是:- Kinit用户名 - 然后输入密码给了我票已保存的消息。 kinit spn(int 格式为 HTTP/FQDN) - 然后输入密码给了我勾选的消息已保存。 过了一段时间,我决定再试一次,所以我使用了命令 从用户名分

  • 问题内容: 我希望能够创建一个自定义AngularJS服务,该服务在其数据对象为空时发出HTTP“获取”请求,并在成功时填充该数据对象。 下次调用此服务时,我想绕过再次发出HTTP请求的开销,而是返回缓存的数据对象。 这可能吗? 问题答案: Angular的$ http 内置了一个缓存。根据文档: cache – {boolean | Object} – 用$ cacheFactory创建的布尔值

  • 应用服务器:IBM Websphere Java 6 问题: 以下是web应用程序的文件夹结构: WEB-INF/库/道具/ 问题是下面的代码不工作: this.getClass(). getResourceAsStream('/props'/fileName),其中fileName是WEB-INF/lib/pros的props文件夹中的有效文件名。 调用上述方法的类位于JAR中,并包含在lib中

  • 我在S3上存储了图像,并使用lambda函数动态调整图像大小。在此过程中,我将添加到调整大小的图像中,并添加一个缓存控件头: 如果已经生成了缩略图,我只需要: null 控制缓存不存在,我想不出来... 当我使发行版中的所有映像无效时,唯一的变化是X-cache的值:第一次加载时的'error from cloudfront'(状态为200,映像加载正常)

  • 我正在从事Laravel(5.4)项目。我正面临一个关于拉威尔观点的奇怪问题。我的所有视图都工作正常,但有些视图总是显示旧内容,我必须手动刷新页面以获取最新数据。我正在使用带有https:///的中间阶段服务器。另一件奇怪的事情是,相同的代码在我的测试服务器上运行良好,它在GoDaddy上,我没有使用https,在它上没有缓存问题,在我的本地主机上也没有缓存问题。请指导我,如何解决这个缓存问题。

  • 我有一个JWS应用程序,它缓存了几种不同的资源类型。但是,我不想缓存.svg图像。框架似乎不遵守我设置的服务器端缓存控制HTTP头。 我想知道是否有其他方法可以在不缓存的情况下加载.svg图像。我愿意在我的方法中放置一个解决方案,但我的代码目前是围绕Apache Batik构建的,用于加载.svg文件。有没有一种解决方案可以在Batik库中传递带有noCache标志的,类似于下面提供的解决方案?