图像在 Rails 中中断生产

Images breaking in production in Rails

在我将数据库从 sqlite3 更改为 postgres 后,我已使用 Cloud9 将我的应用程序部署到 heroku。在那之后我的应用程序一直表现不佳。例如,生产中的图像在上传两三个小时后就中断了,这很糟糕。我还必须每隔几个小时启动一次 PostgreSQL,以便能够使用开发 sudo service postgresql start.

这是我的 database.yml:

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  username: <%= ENV['USERNAME'] %>
  password: <%= ENV['PASSWORD'] %>
  host:     <%= ENV['IP'] %>

development:
  <<: *default
  database: sample_app_development

test:
  <<: *default
  database: sample_app_test

production:
  <<: *default
  database: sample_app_production

我也听说和production.rb有关,所以我的是:

    Rails.application.configure do

  config.cache_classes = true

  config.eager_load = true

  config.consider_all_requests_local       = false
  config.action_controller.perform_caching = true


  config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?


  config.assets.js_compressor = :uglifier

  config.assets.compile = true


  config.assets.digest = true


  config.log_level = :debug


  config.i18n.fallbacks = true

  config.active_support.deprecation = :notify

  config.log_formatter = ::Logger::Formatter.new

  config.active_record.dump_schema_after_migration = false
end

仅供参考,在这个应用程序中注册的用户可以上传图片到应用程序,所以我不能只保存我想要的图片。

由于您不确定上传文件的路径,我认为您的问题出在这里。 我没怎么用过 Heroku,但是从他们的 article:

Each dyno gets its own ephemeral filesystem, with a fresh copy of the most recently deployed code. During the dyno’s lifetime its running processes can use the filesystem as a temporary scratchpad, but no files that are written are visible to processes in any other dyno and any files written will be discarded the moment the dyno is stopped or restarted. For example, this occurs any time a dyno is replaced due to application deployment and approximately once a day as part of normal dyno management.

因此,如果您的图像上传到代码文件系统,它们对其他进程不可见,或者在替换 dyno 后将被丢弃,因为当 heroku 替换 dyno 时,它只考虑上次部署中部署的文件.并且没有上传的图片。

所以我建议你使用像 AWS S3 这样的 CDN。

您的问题有两个问题,第一个是尝试直接在 Heroku 上安装 PGSql。

请注意,与 Digital ocean 或 AWS 的共享服务器不同,Heroku 是一种 PaaS(平台即服务),除了 rails 应用程序之外,您不能将任何东西放在 heroku 服务器上。您必须通过 add-ons.

使用它们

添加 PGSql 也有自己的附加功能,它会自动为您进行定期备份,并且会更加优化以执行数据库操作。

在此处了解更多信息: https://elements.heroku.com/addons/heroku-postgresql

此外,Heroku 不鼓励在服务器上存储静态资产,因为它会在您每次重新启动服务器时回收它们,因此您必须在每次部署时编译您的资产。为了改善这一点,请将它们上传到 CDN 或 S3。