同じサーバー上の異なるバージョンの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を再起動します。 できた

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

Source: https://habr.com/ru/post/J128048/


All Articles