Railsで複数の環境を同時に走らせる方法


この記事について

Railsにはデフォルトでdevelopment, test, productionの3つの環境が用意されていますが、今回はそれらに加えて

  1. 独自の環境を定義する
  2. 複数の環境を同時に走らせる

方法を書いてみます。使っているOS, Sever, Railsのバージョンは以下の通りです。

CentOS Linux release 7.6.1810 (Core)
Server version: Apache/2.4.6 (CentOS)
Phusion Passenger: 5.3.5
Rails 5.1.7

独自環境を定義する

config/environments以下に <new env>.rb というファイルを新しく作ります。<new env>の中身は定義したい環境の名前に置き換えてください。内容は特にこだわりがなければproduction.rbのコピペでいいと思いますが、relateive_urlの設定は新しい環境のパスに合わせて変更しておきましょう

Rails.application.routes.default_url_options = { host: 'localhost', port: 3000, relative_url_root: '/<new env>' }
config.relative_url_root = "/<new env>"

続いて、configフォルダ内の以下のファイルに新しい環境の設定を追加しましょう。書き方はすでに登録されている3つの環境を見ながら書けば、問題ないです。

  • config/cable.yml
  • config/database.yml
  • config/secrets.yml ($bundle exec rake secretであらかじめキーを生成しておく)
  • config/settings.yml

使っているアプリによってはほかにも設定ファイルを定義しているかもしれません。その場合はそのファイルも同様に更新します。

最後に、本番環境用にデプロイする場合はアセットをプリコンパイルしておきましょう

$bundle exec rake assets:precompile RAILS_ENV=<new env>

データベースの作成

新しい環境用にデータベースを作成します。DBのユーザー名やパスワードは設定ファイルで定義されたものが使われます。

$bundle exec rake db:create RAILS_ENV=<new env>
$bundle exec rake db:migrate RAILS_ENV=<new env>

Passenger への登録

ここまでできたら、次はpassengerに新しい環境のURLを登録します。編集するのは/etc/httpd/conf.d/<app name>.conf というファイルです。以下の3つの項目を追記します。

 <Location /<new env>>
    PassengerRuby /usr/local/rvm/gems/ruby-2.4.1/wrappers/ruby
    PassengerHighPerformance off
    PassengerBaseURI /
    PassengerAppRoot /var/www/<new env>
    RailsEnv <new env>
</Location>

Alias /customenv /var/www/<new env>/public

<Directory /var/www/<new env>/public>
    Allow from all
    Options -MultiViews
    # Uncomment this if you're on Apache >= 2.4:
    Require all granted
</Directory>

ディレクトリのパスをすでに登録されているものと別のものにしないといけないので$ln <old env> <new env>などして、シンボリックリンクを作成し、便宜上パスを別物にしておきます。

デプロイ

apacheを再起動しましょう。

$sudo apachectl restart

先ほど定義したパスでアプリケーションをリクエストすると、正常に起動しているはずです
一度アクセスした後であれば$passenger-statusで新しい環境がデプロイされていることが確かめられます。