Rails生产中的图像突破

时间:2017-01-12 07:59:22

标签: ruby-on-rails ruby postgresql heroku cloud9-ide

在将数据库从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

仅供参考,在此应用中,注册的用户可以将图片上传到应用,因​​此我无法保存我想要的图片。

2 个答案:

答案 0 :(得分:2)

由于您不确定上传文件的路径,我相信您的问题就在那里。 我没有多少使用Heroku,而是使用了article

  

每个dyno都有自己的短暂文件系统,并带有最近部署代码的全新副本。在dyno的生命周期中,其运行进程可以将文件系统用作临时暂存器,但是任何其他dyno中的进程都不会看到所写的文件,并且在dyno停止或重新启动时,所写的任何文件都将被丢弃。例如,每次因应用程序部署而更换dyno时都会发生这种情况,并且大约每天一次作为正常dyno管理的一部分。

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

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

答案 1 :(得分:0)

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

了解与Digital Ocean或AWS的共享服务器不同,Heroku是一种Pa​​aS(平台即服务),除了rails应用程序之外,您无法在heroku服务器上放置任何内容。您必须通过add-ons使用它们。

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

在此处了解详情: https://elements.heroku.com/addons/heroku-postgresql

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