[Ruby] 在将Rails部署到Heroku时需注意的七个事项 [Heroku]

最近,我们举办了一场针对Ruby开发者的Heroku入门网络研讨会。现在,我想对这次活动的内容进行回顾,并补充一些注意事项的解释。

请参阅原始幻灯片,了解面向Ruby开发者的Heroku入门。

部署之前的注意事项

在部署之前,我将介绍开发应用程序时应考虑的五个要点。

1. 关于选定数据库服务器的问题

在Heroku上,一般推荐使用Heroku Postgres作为RDBMS,而在需要高速NoSQL数据库的情况下,则推荐使用Heroku Redis。原因是这些都是Heroku提供的插件,并且特别推荐使用Heroku Postgres的原因是它始终可以使用最新版本。

当然,您也可以使用MySQL、Mongo、Cassandra等第三方供应商提供的数据库,但对于Heroku而言,我们建议使用以”Heroku”为开头的附加组件,这些以”Heroku”开头的组件表示它们是由Heroku提供的附加功能。

另外,不建议使用SQLite。原因是Heroku Dyno根据约定每隔约24小时进行重启,这会导致本地磁盘被初始化。

2. 数据库配置文件/database.yml

不仅仅限于Heroku Postgres,与数据库的连接定义通常是通过环境变量进行定义的。当在Rails中使用数据库时,可以通过使用这个连接定义来简单地进行连接。

如果使用Heroku Postgres,可以这样写。

production:
  url: <%= ENV['DATABASE_URL'] %>

3. 进程文件

Heroku会根据部署时文件的组织和内容,大致自动选择最佳配置并应用。对于Ruby,Rails和Rack规范的Web应用将立即被检测到,并自动定义常见的启动步骤和环境变量。

然而,如果想选择与通常不同的启动方法(例如,希望使用 Thin 而非 Webrick)或者设置 Worker Dyno 的启动步骤而不是 Web Dyno,则需要定义 Procfile。

如果要启动常规的 Rails 应用,通常需要在 Procfile 中进行配置。但是,如果使用 Heroku,它会自动执行,而无需准备 Procfile。

web: bundle exec rails server -p $PORT -e $RAILS_ENV

如果想要设定与通常不同的启动步骤或Worker Dyno的启动步骤,可以这样做

bash: Procfile
web: 使用bundle exec运行app.rb

mqtt: 使用bin/proximo运行bundle exec mqtt.rb

redshift: 使用bin/proximo运行bundle exec redshift.rb

在这种情况下,Web服务器由app.rb启动。已准备好mqtt和redshift两个Worker Dyno,并在与Web Dyno分开的非同步方式下执行。另外,bin/proximo使用Proximo插件来固定IP地址并使用。因此,如果要使用特定的启动步骤,则Procfile是必需的。

在外部连接时,有两种方法可以固定IP化。

4. Gemfile (适用于Rails4的情况)

让我们像咒语一样记住它。

在使用Heroku部署Rails的情况下,请定义使用rails_12factor Gem用于生产环境。

group :production do
  # Use postgresql as the database for Active Record
  gem 'pg', '~> 0.15'
  # Use easily Heroku with Rails
  gem 'rails_12factor'
end

从Rails5开始不再需要。

5. 配置/秘密.yml

有时候,会在.gitignore文件中指定config/secret.yml文件不包含在git的目标中。如果在.gitignore文件中定义了/config/secret.yml,请注释或删除它。

由于通常情况下已经被定义为标准方式,我们将保持原样。在Heroku上,如果检测到Rails应用程序,将自动生成 SECRET_KEY_BASE 环境变量。

production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

部署时的注意事项

在部署时,我将为您解释两个需要牢记的注意事项。

1. Gemfile.lock 是必需的

如果从其他地方克隆了git,则可能不太需要,但如果要部署自己的Web应用程序,则Gemfile.lock是必需的。

因此,可能需要使用Linux/Mac等UNIX环境(如果有Windows的方法,请告诉我)。Heroku在部署时似乎会根据Gemfile.lock文件注册Rubygems。

以下是Heroku在执行部署时通过bundle install进行的目录指定的示例,请参考。

bundle install --path vendor/bundle --binstubs vendor/bundle/bin

需要进行数据库的迁移。

我记得以前有自动执行的功能,但现在需要手动迁移了。在部署到Heroku后,如果不在Heroku上执行db:migrate,数据库表将一直不存在,并持续报错。

heroku run bundle exec rake db:migrate

其他

在优化和运行应用程序时,Heroku和Heroku Dyno有着最小的限制要求。

请参阅限制以获取详细信息。

广告
将在 10 秒后关闭
bannerAds