同じサーバー上の異なるバージョンのruby(Nginx + Unicorn)で複数のRuby on Railsプロジェクトを上げる

こんにちはハブラ



同じサーバーに複数の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 {        #     ,    unicorn.rb        server unix:/home/username/www/project/tmp/sockets/unicorn.sock;    }    upstream redmine {        server unix:/home/username/www/redmine/tmp/sockets/unicorn.sock;    } }
      
      







したがって、各「仮想ホスト」から、対応するユニコーンソケットを使用する目的のストリームにプロキシパスを作成します。



 server {    listen 80;    server_name project;    location / {        root /home/username/www/project/public;        if (!-f $request_filename) {            #     "project"            proxy_pass http://project;            break;        }    } }
      
      







そして



 server {    listen 80;    server_name redmine;    location / {        root /home/username/www/redmine/public;        if (!-f $request_filename) {            #     "redmine"            proxy_pass http://redmine;            break;        }    } }
      
      







nginxを再起動します。 できた



誰かが役に立つと時間を節約できることを願っています。



All Articles