2

我一直在修改为在 nginx 后面运行的 rails 应用程序设置多个云端端点,以改善页面加载时间。基本上 - 我们之前设置了一个端点,看起来工作正常,但是当我使用以下资产主机声明添加第二个端点时:

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

每当我部署(使用漂亮的香草 capistrano 部署脚本)时,一些资产没有加载 - 云端正在缓存 nginx 404 页面。如果我使 Cloudfront 的缓存无效,则所有资产都可以正常加载。

capistrano 脚本本身在重新启动 unicorn 之前进行编译,因此不应提供包含对新资产文件名的引用的 html,但是,Cloudfront 会在部署后立即缓存 404。

我当然不能在每次部署后使云端缓存失效,这需要太长时间。有没有人遇到过这个问题?有关如何解决此问题的任何建议?

4

1 回答 1

2

我想通了。结果是我们的预加载和资产更改监控端点(当资产更改并需要重新加载时向前端报告)正在针对磁盘上的摘要列表进行测试以做出此决定。自然地 - 磁盘上的摘要可以在所有机器上实际编译的摘要之前进行,导致浏览器尝试在它们实际准备好之前获取资产。

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

MyAppNamespace::Application.config.assets.digests

希望这对其他人有帮助!

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

于 2013-11-04T18:58:54.977 回答