ホーム > カテゴリ > Ruby・Ruby on Rails >

Nginx + Pumaで複数のRailsプロジェクトを実行する [CentOS]

CentOSで各種サーバー構築(目次)

Nginx/Pumaで1つのドメイン(IPアドレス)で複数のRuby on Railsのプロジェクトを実行する方法です。サービスを使用した自動起動にも対応です。

やること

http://IPアドレス/ccc/Ruby on Railsプロジェクト
実際のパス:/home/ユーザー名/sample1
http://IPアドレス/ddd/Ruby on Railsプロジェクト
実際のパス:/home/ユーザー名/sample2

※サブディレクトリを切って実行させています。

実行例

http://IPアドレス/ccc/

http://IPアドレス/ddd/

1. Railsプロジェクトの作成

[sample1]

// Railsプロジェクト
cd ~/
mkdir sample1
cd sample1
rails new . -d postgresql
 
※/home/ユーザー名/sample1にプロジェクトが生成される
 
// データベースの生成
bin/rails db:create
 
// モデルの作成(モデル/マイグレーションファイルの生成)
bin/rails g model Pig name:string description:text
 
// マイグレーションの実行(テーブルの生成)
bin/rails db:migrate
 
// コントローラーの作成(コントローラー/ビューの生成)
bin/rails g controller pigs index show new edit

[sample2]

// Railsプロジェクト
cd ~/
mkdir sample2
cd sample2
rails new . -d postgresql
 
※/home/ユーザー名/sample2にプロジェクトが生成される
 
// データベースの生成
bin/rails db:create
 
// モデルの作成(モデル/マイグレーションファイルの生成)
bin/rails g model Cow name:string description:text
 
// マイグレーションの実行(テーブルの生成)
bin/rails db:migrate
 
// コントローラーの作成(コントローラー/ビューの生成)
bin/rails g controller cows index show new edit

2. config/routes.rbの編集

// sample1/config/routes.rb
Rails.application.routes.draw do
  get 'pigs/index'
  get 'pigs/show'
  get 'pigs/new'
  get 'pigs/edit'

  root to: 'pigs#index'
end

// sample2/config/routes.rb
Rails.application.routes.draw do
  get 'cows/index'
  get 'cows/show'
  get 'cows/new'
  get 'cows/edit'
  
  root to: 'cows#index'
end

3. プロジェクト名/config.ruの編集

[sample1]

RAILS_RELATIVE_URL_ROOT='/ccc'
 
require_relative 'config/environment'
 
if RAILS_RELATIVE_URL_ROOT then
  map RAILS_RELATIVE_URL_ROOT do
    run Rails.application
  end
else
  run Rails.application
end
 
# 元のコード
# require_relative 'config/environment'
# run Rails.application

[sample2]

RAILS_RELATIVE_URL_ROOT='/ddd'
 
require_relative 'config/environment'
 
if RAILS_RELATIVE_URL_ROOT then
  map RAILS_RELATIVE_URL_ROOT do
    run Rails.application
  end
else
  run Rails.application
end
 
# 元のコード
# require_relative 'config/environment'
# run Rails.application

4. プロジェクト名/my_puma.rbを作成する

[sample1]

workers Integer(ENV['WEB_CONCURRENCY'] || 2)
threads_count = Integer(ENV['RAILS_MAX_THREADS'] || 5)
threads threads_count, threads_count

preload_app!

bind "unix:///home/ユーザー名/sample1/tmp/puma.sock"

rackup      DefaultRackup
port        ENV['PORT']     || 3000
environment ENV['RACK_ENV'] || 'development'

on_worker_boot do
  ActiveRecord::Base.establish_connection
end

[sample2]

workers Integer(ENV['WEB_CONCURRENCY'] || 2)
threads_count = Integer(ENV['RAILS_MAX_THREADS'] || 5)
threads threads_count, threads_count

preload_app!

bind "unix:///home/ユーザー名/sample2/tmp/puma.sock"

rackup      DefaultRackup
port        ENV['PORT']     || 3001
environment ENV['RACK_ENV'] || 'development'

on_worker_boot do
  ActiveRecord::Base.establish_connection
end

注意事項としてsample1のPortは3000、sample2のPortは3001にして下さい。これは同じポートだと1つしか動作しないからです。

5. サービスファイルを作成する

[sample1]

sudo vi /usr/lib/systemd/system/puma_sample1_app.service

[Unit]
Description=Puma HTTP Server1
After=network.target

[Service]
# サービスプロセスの起動完了の判定方法
Type=simple

# ユーザー名
User=ユーザー名

# プロジェクトパス
WorkingDirectory=/home/ユーザー名/sample1

# サービス起動(-Cは指定された設定ファイルを読み込む)
ExecStart=/home/ユーザー名/.rbenv/shims/puma -C /home/ユーザー名/sample1/my_puma.rb

# 落ちた場合は自動で再起動 ※systemctl stopは除く
Restart=always

[Install]
# ターゲット
WantedBy=multi-user.target

[sample2]

sudo vi /usr/lib/systemd/system/puma_sample2_app.service

[Unit]
Description=Puma HTTP Server2
After=network.target

[Service]
# サービスプロセスの起動完了の判定方法
Type=simple

# ユーザー名
User=ユーザー名

# プロジェクトパス
WorkingDirectory=/home/ユーザー名/sample2

# サービス起動(-Cは指定された設定ファイルを読み込む)
ExecStart=/home/ユーザー名/.rbenv/shims/puma -C /home/ユーザー名/sample2/my_puma.rb

# 落ちた場合は自動で再起動 ※systemctl stopは除く
Restart=always

[Install]
# ターゲット
WantedBy=multi-user.target

ExecStartの「/home/ユーザー名/.rbenv/shims/puma」のパスは「which puma」のコマンドで表示されるパスを設定します。

※必要に応じてUnicornの自動起動のようにPIDFileを設定して下さい。

6. サービスのコマンド

次はsample1の「puma_sample1_app」のコマンド例ですが、sample2の場合は「puma_sample2_app」に置き換えてください。

// デーモンリロード
sudo systemctl daemon-reload

// 以下、puma_sample1_appをpumaサービスと呼ぶ

// pumaサービスの起動
sudo systemctl start puma_sample1_app

// pumaサービスの停止
sudo systemctl stop puma_sample1_app

// pumaサービスのリスタート
sudo systemctl restart puma_sample1_app

// pumaサービスのステータスのチェック
sudo systemctl status puma_sample1_app

// pumaサービスをOS起動時に自動起動する
sudo systemctl enable puma_sample1_app
// 上記を無効にする
sudo systemctl disable puma_sample1_app

// サービスの一覧情報
sudo systemctl list-unit-files

7. Nginxの設定ファイル(nginx.conf)の編集

sudo vi /etc/nginx/nginx.conf

user ユーザー名;

worker_processes auto;

events {
    worker_connections  1024;
}

http {
    server_tokens off;
    
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    access_log  /var/log/nginx/access.log;
    error_log   /var/log/nginx/error.log;
    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

※/*.confからコメントの緑色になっていますが、全て必要です。

Nginxのバージョンが1.12より新しい場合は「/etc/nginx/conf.d/default.conf」が存在する場合があります。その場合は正常に動作しないので「sudo rm /etc/nginx/conf.d/default.conf」でdefault.confを削除して下さい。

8. myapp.confを作成する

sudo vi /etc/nginx/conf.d/myapp.conf

upstream puma_sample1_app {
    server  unix:/home/ユーザー名/sample1/tmp/puma.sock;
}

upstream puma_sample2_app {
    server  unix:/home/ユーザー名/sample2/tmp/puma.sock;
}
 
server {
    listen       80;
    server_name  IPアドレス;
 
    client_max_body_size 100m;
    error_page   404              /404.html;
    error_page   500 502 503 504  /50x.html;          
    
    # /home/ユーザー名/プロジェクト名/publicの各ファイルにアクセス可能にする
    location ~ ^/ccc/assets/(.*) {
        alias /home/ユーザー名/sample1/public/assets/$1;
    }   

    # /home/ユーザー名/プロジェクト名/publicの各ファイルにアクセス可能にする
    location ~ ^/ddd/assets/(.*) {
        alias /home/ユーザー名/sample2/public/assets/$1;
    }   

    # sample1
    location /ccc/ {
        alias /home/ユーザー名/sample1/public;
        try_files $uri @puma_sample1_app;
    }
    location @puma_sample1_app {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
        proxy_pass http://puma_sample1_app;
    }
    
    # sample2
    location /ddd/ {
        alias /home/ユーザー名/sample2/public;
        try_files $uri @puma_sample2_app;
    }
    location @puma_sample2_app {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
        proxy_pass http://puma_sample2_app;
    }   

}

9. 動作確認

最後にNginxを再起動して動作確認をするだけです。

sudo systemctl restart nginx

参考URL

https://github.com/puma/puma/blob/master/docs/systemd.md

関連

Nginx + Unicornで複数のRailsプロジェクトを実行する





関連記事



公開日:2019年09月21日 最終更新日:2019年12月12日
記事NO:02779