我一直在为在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
每当我部署(使用漂亮的capistrano部署脚本)时,某些资产就不会加载-cloudfront正在缓存nginx 404页面。如果我使cloudfront的缓存无效,则资产全部可以正常加载。
capistrano脚本本身会在重新启动unicorn之前进行编译,因此不应在html中引用新资产文件名,但cloudfront会在部署后立即缓存404。
我当然不能在每次部署后使Cloudfront缓存失效,这花费了太长时间。有没有人遇到这个问题?有关如何解决此问题的任何建议?
我想通了。事实证明,我们的预加载和资产更改监视端点(在资产更改并需要重新加载时向前端报告)正在根据摘要的磁盘列表进行测试以确定这一点。自然地-磁盘摘要可以先于所有机器上实际编译的摘要,从而导致浏览器尝试在实际准备就绪之前获取资产。
对于使用这种技术测试资产变更的其他人-我建议使用存储在以下位置的应用程序中的哈希值:
MyAppNamespace::Application.config.assets.digests
希望这对别人有帮助!
[更新]实际上-问题的真正根源是使用:hash方法确定要提供哪个url-尽管该方法的输出在单个进程中将是一致的-不会跨进程,因此将使用不同的服务器不同的哈希值,并且由于它们都位于平衡器后面,因此并非所有服务器都具有所请求的资产。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句