ruby-on-rails - Cloudfront 正在缓存来自 nginx 的 404 错误,以获取源服务器上确实存在的 Assets

标签 ruby-on-rails caching nginx capistrano amazon-cloudfront

我一直在尝试为在 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 部署脚本)时,某些 Assets 都不会加载 - cloudfront 正在缓存 nginx 404 页面。如果我使 Cloudfront 的缓存无效,则所有 Assets 都可以正常加载。

capistrano 脚本本身会在重新启动 unicorn 之前进行编译,因此不应提供引用新 Assets 文件名的 html,但尽管如此,cloudfront 在部署后会立即缓存 404。

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

最佳答案

我明白了这一点。事实证明,我们的预加载和 Assets 更改监控端点(当 Assets 更改并需要重新加载时向前端报告)正在针对磁盘上的摘要列表进行测试以做出此决定。当然,磁盘上的摘要可能会先于所有机器上实际编译的摘要,导致浏览器在 Assets 实际准备好之前尝试获取 Assets 。

对于其他使用此类技术来测试 Assets 更改的人 - 我是否建议使用应用程序中存储的哈希值:

MyAppNamespace::Application.config.assets.digests

希望这对其他人有帮助!

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

关于ruby-on-rails - Cloudfront 正在缓存来自 nginx 的 404 错误,以获取源服务器上确实存在的 Assets ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19716779/

相关文章:

ruby-on-rails - 初始化程序或 Gem 未加载 Unicorn 导致 500 内部服务器错误

css - 我怎样才能覆盖bootstrap css样式?

caching - 在 webpack 中使用 CommonsChunkPlugin 时需要 Etag 和 Last-Modified header

css - 整个网站是否自动缓存(Google 使用 <style>)?

angularjs - 'Access-Control-Allow-Origin' header 包含多个值 - nginx + sails.js

ruby-on-rails - rspec 中的 subject.invoke 是什么?

ruby-on-rails - Rails 模型调用 Controller Action

java - 基于日期的ehcache

使用 nginx 的子目录中的 CakePHP(重写规则?)

python - 将 $ssl_client_s_dn 从 nginx/uwsgi 传递到 flask app