我一直在为运行在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缓存失效,这太耗时了。有没有人遇到过这个问题?对于如何解决这个问题,有什么建议吗?
2条答案
按热度按时间huwehgph1#
我想通了。事实证明,我们的预加载和资产更改监视端点(在资产更改并需要重新加载时向前端报告)正在根据磁盘上的摘要列表进行测试,以做出此确定。当然,磁盘上的摘要可能会领先于所有机器实际编译的摘要,导致浏览器试图在资产实际准备好之前获取资产。
对于使用这种技术测试资产更改的其他人,我是否建议在存储在以下位置的应用程序中使用散列:
希望这对其他人有帮助!
[更新]实际上-问题的真正来源是使用:Hash方法来确定要提供哪个URL-尽管该方法的输出将在单个进程中保持一致-它不会跨进程,因此不同的服务器提供不同的哈希,而且由于它们都在平衡器后面,并不是所有的服务器都有被请求的资产。
xggvc2p62#
找不到解决我面临的相同问题的帮助。仍在研究CF CDN如何知道从哪个服务器/示例获取资产。
我在本地负载均衡器后面有3台服务器(都托管在S3上)。然后是CF CDN,它经常在其中一个服务器上存在的媒体文件上抛出404,以及CF在WWW上寻找它。