对于源服务器上确实存在的资产,CloudFront正在缓存来自nginx的404

zz2j4svz  于 2022-10-06  发布在  Nginx
关注(0)|答案(2)|浏览(255)

我一直在为运行在nginx后面的Rails应用程序设置多个CloudFront端点,以改善页面加载时间。基本上-我们之前设置了一个端点,看起来运行良好,但当我使用以下ASSET_HOST声明添加第二个端点时:

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

每当我部署(使用一个非常普通的Capstrano部署脚本)时,一些资产没有加载--CloudFront正在缓存nginx 404页面。如果我使CloudFront的缓存无效,所有资产都加载得很好。

Capstrano脚本本身在重新启动unicorn之前进行编译,因此应该不会提供对新资产文件名的引用的html,然而,CloudFront在部署之后立即缓存404。

我当然不能在每次部署后都使CloudFront缓存失效,这太耗时了。有没有人遇到过这个问题?对于如何解决这个问题,有什么建议吗?

huwehgph

huwehgph1#

我想通了。事实证明,我们的预加载和资产更改监视端点(在资产更改并需要重新加载时向前端报告)正在根据磁盘上的摘要列表进行测试,以做出此确定。当然,磁盘上的摘要可能会领先于所有机器实际编译的摘要,导致浏览器试图在资产实际准备好之前获取资产。

对于使用这种技术测试资产更改的其他人,我是否建议在存储在以下位置的应用程序中使用散列:

MyAppNamespace::Application.config.assets.digests

希望这对其他人有帮助!

[更新]实际上-问题的真正来源是使用:Hash方法来确定要提供哪个URL-尽管该方法的输出将在单个进程中保持一致-它不会跨进程,因此不同的服务器提供不同的哈希,而且由于它们都在平衡器后面,并不是所有的服务器都有被请求的资产。

xggvc2p6

xggvc2p62#

找不到解决我面临的相同问题的帮助。仍在研究CF CDN如何知道从哪个服务器/示例获取资产。

我在本地负载均衡器后面有3台服务器(都托管在S3上)。然后是CF CDN,它经常在其中一个服务器上存在的媒体文件上抛出404,以及CF在WWW上寻找它。

相关问题