こんにちはハブラ
同じサーバーに複数のRuby on Railsアプリケーションをデプロイする方法を共有したいと思います。
このRVM、Unicorn、およびNginxで役立ちます。
最近、顧客は、Ruby on Railsプロジェクトがすでに実行されており、Rubバージョン1.9.2を使用しているサーバーに
Redmineを配置するように要求しました。 また、redmineは最大ruby-1.8.7で動作します。 サーバーに他のプロジェクトを配置することを意図していないため、最初にNginx + mod_passengerがインストールされました。 ご存知のように、同じサーバーでmod_passengerを使用すると、異なるバージョンのRubyで2つのアプリケーションを実行することはありません。
はじめに、RVMを使用して各プロジェクトの環境を設定しましょう。
rvmがインストールされている場合、
インストールされていない場合は、
installを想定しています。
カットには2つのバージョンが必要です。
$ rvm install 1.9.2 $ rvm install 1.8.7
便宜上、プロジェクトごとに独自のgemセットを作成します。
$ rvm use 1.9.2 $ rvm gemset create project $ rvm use 1.8.7 $ rvm gemset create redmine
したがって、セット
1.9.2@projectおよび
1.8.7@redmineを取得します
rvmが目的のバージョンのRubyと一連のgemに自動的に切り替わるようにするには、次の手順を実行します。
$ echo "rvm use 1.9.2@project" > /home/username/www/project/.rvmrc $ echo "rvm use 1.8.7@redmine" > /home/username/www/redmine/.rvmrc
これで、コンソールでプロジェクトディレクトリを変更すると、プロジェクトに必要なバージョンのrubyとgemのセットが自動的に接続されます。
ユニコーンをインストールする必要があります。 3.0のRailsバージョンを使用するプロジェクトの場合、これは行を追加することで行われます
gem 'unicorn'
プロジェクトのルートにあるgemfileに実行中
$ bundle install
redmineの場合、次のようにユニコーンをインストールする必要があります。
$ cd /home/username/www/redmine $ gem install unicorn
ユニコーンのプロジェクト構成を作成します(/home/username/www/redmine/config/unicorn.rb):
worker_processes 2 working_directory "/home/username/www/redmine/" preload_app true timeout 30 listen "/home/username/www/redmine/tmp/sockets/unicorn.sock", :backlog => 64 pid "/home/username/www/redmine/tmp/pids/unicorn.pid" stderr_path "/home/username/www/redmine/log/unicorn.stderr.log" stdout_path "/home/username/www/redmine/log/unicorn.stdout.log" before_fork do |server, worker| defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect! end after_fork do |server, worker| defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection end
類推により、別のプロジェクトの構成を作成します。
次に、各プロジェクトごとに、ユニコーンをデーモンとして実行する必要があります。
$ cd /home/username/www/redmine $ unicorn_rails -c config/unicorn.rb -E production -D $ cd /home/username/www/project $ unicorn_rails -c config/unicorn.rb -E production -D
nginxを構成するために残ります。 2つのストリームハンドラー(各プロジェクトに1つ)をnginx.confに追加します。
... http { ... upstream project {
したがって、各「仮想ホスト」から、対応するユニコーンソケットを使用する目的のストリームにプロキシパスを作成します。
server { listen 80; server_name project; location / { root /home/username/www/project/public; if (!-f $request_filename) {
そして
server { listen 80; server_name redmine; location / { root /home/username/www/redmine/public; if (!-f $request_filename) {
nginxを再起動します。 できた
誰かが役に立つと時間を節約できることを願っています。